提问人:Pierre 提问时间:10/10/2023 最后编辑:Pierre 更新时间:10/12/2023 访问量:59
Subversion + Tortoise 命令创建分叉或分支
Subversion + Tortoise commands to create a fork or branch
问:
我有一个用于源代码的 Subversion 存储库。我需要像六年前一样根据代码创建一个分支。我需要对这个旧代码进行修改,并将其提交回存储库(作为一个分支)。此代码永远不会合并到主干中。
创建分支或分支的分步 Tortoise 命令是什么,如何将更改提交回存储库?
更多详情:
假设我的主要工作副本位于 中。我需要在我的计算机上保持此版本,因为它是当前的生产版本。C:\ACME
我做了一个 SVN Checkout to ,回到较旧的 2017 版本。然后我对那个版本做了一些更改。我现在想创建一个分支并将 F:\ACME_OLD 中的更改提交回存储库。这些变化不会合并到主分支中,它们将过着自己的生活。的命令是什么?F:\ACME_OLD
我在计算机上找不到文件。由于对目录结构的误解或误解,我犹豫是否要切换到直接从命令行调用 SVN。SVN.EXE
我是右键单击并执行 ,还是 on 然后将更改从 F: 复制到 C:?TortoiseSVN ➔ Branch/tag
F:\ACME_OLD
C:\ACME
我需要在我的计算机上保持两个版本处于活动状态。
对不起,我担心在我的生产系统上进行实验或走错路。
答:
在 Subversion 中,分支和标签是使用 copy 子命令创建的。从概念上讲,将软件的一个版本复制到分支,就像在文件系统上复制文件一样。
我将首先介绍 CLI 命令,因为它们简洁明了。CLI 与 TortoiseSVN 一起安装,但不一定添加到 .假设你位于工作副本中,并且存储库具有默认的主干/分支/标记布局,则操作将如下所示:PATH
svn copy -r {2017-10-11} ^/trunk ^/branches/archeology -m"Create branch from trunk of six years ago"
# Switch to the newly created branch
svn switch ^/branches/archeology
# Make your changes as usual ...
# Commit your changes back into the branch
svn commit -m"Wow, that was a lot of work"
请注意,上面的示例使用了修订日期功能。将解决到2017年10月11日午夜后不久的最后一次修订。{2017-10-11}
如果您知道要开始的修订版,也可以使用它。
使用 TortoiseSVN 的 GUI,过程是一样的,只是你使用 GUI,如创建分支的文档中所述。
那是 TortoiseSVN -> 分支/标签 ...。在对话框中,输入新分支的路径和日志消息。在存储库中选择“特定修订版”,然后输入修订号或使用“显示日志”按钮浏览到分支的起点。(不幸的是,我不知道 TortoiseSVN 是否也接受修订日期,现在无法测试,但值得一试。 使用“确定”按钮创建分支。
别忘了使用 TortoiseSVN -> Switch 切换到新创建的分支的工作副本。
进行更改后,提交它们。
Subversion 实际上有很好的文档记录,所以检查文档总是值得一试的。
以下部分涉及问题的编辑。
关注:您可能必须在 TortoiseSVN 的安装过程中检查该选项。我经常这样做。我更像是一个空壳人。您不需要 CLI,如果您想拥有它,请考虑重新安装。svn.exe
我能理解你对生产系统出现问题的担忧。没有人希望这种情况发生。Subversion 的强项之一是,作为用户,很难真正破坏任何东西。保留本地更改,不需要的更改可以反向合并,甚至删除的文件和分支仍然可以在修订版中访问(如果它们存在)。
如果您想要额外的安全层,请制作工作副本的本地副本。如果你想做到超级安全,请使用备份你的存储库(无论如何你都应该定期备份)。尽管我有根据的猜测是,通过滥用来破坏你的 repo 比通过拙劣的分支创建更容易。svnadmin dump
svnadmin
回到手头的问题。分支创建是一项存储库操作。您根本不需要从工作副本运行它。在上面的示例中,插入符号被 Subversion 方便地替换为存储库 URL(例如 )。您实际上使用 URL -> URL 形式的复制来创建分支。^
https://svn.example.com/ACME
当我们要继续在那里时,请转到创建分支。按照上面链接的 TortoiseSVN 的说明创建一个分支。只需确保将存储库中的“特定修订版”设置为 2017 版即可。F:\ACME_OLD
因此,您将从例如 (或您的“主线”分支的名称)到一个新分支。实际上,您只需要注意两件事:https://svn.example.com/ACME/trunk
https://svn.example.com/ACME/branches/OLD
- 您将正确的 2017 年修订版作为开始修订版
- 你的新分支与你的分支平行,而不是在它下面
trunk
完成后,将 切换到新创建的 .更新时,不应看到大量更改,因为工作副本应已处于该状态。还应保留本地更改。F:\ACME_OLD
https://svn.example.com/ACME/branches/OLD
在检查一切正常后,您可以 SVN 提交...您的更改,它们应该只在分支上可见,而不是(在 SVN 更新后)在 .F:\ACME_OLD
C:\ACME
评论
trunk
我不完全确定你的疑虑是什么,但我怀疑整个 Subversion 模型可能会有一些混淆。关键概念:
Subversion 是一个集中式版本控制系统(与 Git 等分布式系统相反)。将更改从工作副本提交到存储库,并更新工作副本以抓取存储库更改。👉 您永远不会在两个工作副本之间直接传输信息。甚至没有命令或工具可以做到这一点。
Subversion 实际上并没有实现分支或标签。它们只不过是一种命名约定,基于两个功能:
便宜的副本。在 Subversion 中复制目录不会导致所有文件被复制,存储空间翻倍。仅存储引用。
Working copies can point to any specific subdirectory, you don't have to check out the entire repository.
This allows to have a directory structure above your project's root that can be used to create additional directories with copies of your project root that will be conventionally considered branches or tags.
The most widespread and recommended convention is to have this structure:
__ trunk
\_ branches
\_ feature-a
\_ feature-b
\_ ...
\_ tags
\_ 1.0.0
\_ 1.1.0
\_ 2.0.0-alpha1
\_ ...
trunk
would be the equivalent of / branch used by Git.master
main
TortoiseSVN understands this convention and will offer some additional features (for example, it'll warn you if you attempt to write on a tag).
评论