Subversion + Tortoise 命令创建分叉或分支

Subversion + Tortoise commands to create a fork or branch

提问人:Pierre 提问时间:10/10/2023 最后编辑:Pierre 更新时间:10/12/2023 访问量:59

问:

我有一个用于源代码的 Subversion 存储库。我需要像六年前一样根据代码创建一个分支。我需要对这个旧代码进行修改,并将其提交回存储库(作为一个分支)。此代码永远不会合并到主干中。

创建分支或分支的分步 Tortoise 命令是什么,如何将更改提交回存储库?


更多详情: 假设我的主要工作副本位于 中。我需要在我的计算机上保持此版本,因为它是当前的生产版本。C:\ACME

我做了一个 SVN Checkout to ,回到较旧的 2017 版本。然后我对那个版本做了一些更改。我现在想创建一个分支并将 F:\ACME_OLD 中的更改提交回存储库。这些变化不会合并到主分支中,它们将过着自己的生活。的命令是什么?F:\ACME_OLD

我在计算机上找不到文件。由于对目录结构的误解或误解,我犹豫是否要切换到直接从命令行调用 SVN。SVN.EXE

我是右键单击并执行 ,还是 on 然后将更改从 F: 复制到 C:?TortoiseSVN ➔ Branch/tagF:\ACME_OLDC:\ACME

我需要在我的计算机上保持两个版本处于活动状态。

对不起,我担心在我的生产系统上进行实验或走错路。

SVN SVN

评论


答:

2赞 Friedrich 10/11/2023 #1

在 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 dumpsvnadmin

回到手头的问题。分支创建是一项存储库操作。您根本不需要从工作副本运行它。在上面的示例中,插入符号被 Subversion 方便地替换为存储库 URL(例如 )。您实际上使用 URL -> URL 形式的复制来创建分支。^https://svn.example.com/ACME

当我们要继续在那里时,请转到创建分支。按照上面链接的 TortoiseSVN 的说明创建一个分支。只需确保将存储库中的“特定修订版”设置为 2017 版即可。F:\ACME_OLD

因此,您将从例如 (或您的“主线”分支的名称)到一个新分支。实际上,您只需要注意两件事:https://svn.example.com/ACME/trunkhttps://svn.example.com/ACME/branches/OLD

  • 您将正确的 2017 年修订版作为开始修订版
  • 你的新分支与你的分支平行,而不是在它下面trunk

完成后,将 切换到新创建的 .更新时,不应看到大量更改,因为工作副本应已处于该状态。还应保留本地更改。F:\ACME_OLDhttps://svn.example.com/ACME/branches/OLD

在检查一切正常后,您可以 SVN 提交...您的更改,它们应该只在分支上可见,而不是(在 SVN 更新后)在 .F:\ACME_OLDC:\ACME

评论

1赞 Friedrich 10/12/2023
@Pierre更新了我的答案以解决您的编辑问题。您的编辑为改善您的问题做了很多工作。
1赞 Pierre 10/12/2023
感谢您慷慨而详细的回答。很抱歉迟钝,但我的主线在“MyServer.MyDomain.com/svn/ACME”。没有明确的“主干”。您强调分支应与主干平行,而不是从属。但是如果我这样做(vg。“MyServer.MyDomain.com/svn/ACME_OLD”),这将是一个单独的项目。我不确定这是我想做的吗?
1赞 Friedrich 10/12/2023
我之所以这样写,是因为我有一种感觉,可能是这样。您不是第一个添加中继的人,请参阅 SVN 在现有存储库上创建中继目录。从本质上讲,您创建一个目录并将文件移动到那里。trunk
1赞 Pierre 10/13/2023
这听起来充满了危险。我必须通过暂存测试服务器并完成所有步骤来演练该过程。迁移后,存储库对客户端来说会是什么样子?我认为更无风险的解决方案是简单地使用分叉代码创建一个新项目。再次感谢您的专家帮助。
1赞 Álvaro González 10/14/2023
我以前工作的同事突然决定停止在新存储库中创建主干/分支/标签结构,原因只有他们自己知道,我不得不在项目中期添加它。这很烦人,但风险不大(只有一点点)。特别是,您需要非常小心地使用 SVN Move 命令,而不仅仅是在 Windows 资源管理器中移动文件。否则,您将失去一大堆历史。所以,是的,首先使用存储库的副本(转储 + 加载)对其进行测试:)
1赞 Álvaro González 10/12/2023 #2

我不完全确定你的疑虑是什么,但我怀疑整个 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.mastermain

TortoiseSVN understands this convention and will offer some additional features (for example, it'll warn you if you attempt to write on a tag).