如何创建一个分支?

666

我如何在SVN中创建一个分支?

10个回答

640

使用以下svn copy命令创建一个新的分支:

$ svn copy svn+ssh://host.example.com/repos/project/trunk \
           svn+ssh://host.example.com/repos/project/branches/NAME_OF_BRANCH \
      -m "Creating a branch of project"

28
接下来使用 svn switch svn+ssh://host.example.com/repos/project/branches/NAME_OF_BRANCH . (如果要将当前的检出转换为新分支),或者使用 svn checkout svn+ssh://host.example.com/repos/project/branches/NAME_OF_BRANCH (如果要在单独的目录中创建新分支)开始在新创建的分支上工作。 - Jakub Narębski
6
注意:在某些情况下,您需要使用 svn copy 命令的 --parents 选项! - Jakub Narębski
1
由于某种原因,我使用了这个命令,但它没有起作用,但当我将svn+ssh更改为https时,它确实起作用了。我做错了什么吗?svn+ssh的含义是什么?谢谢! - Aviel Gross
你需要先在你的分支中创建一个新目录 -> svn mkdir host.example.com/repos/project/branches/NAME_OF_BRANCH -m "创建分支目录以容纳所有分支" - Silvio Troia
如果我省略了-m选项,它会显示类似于svn: E155010: 路径'/home/constantine/someDirectory/svn+ssh:https:/myhost.com/svn/dir1/dir2/trunk/dir3/dir4/dir5'不存在。使用-m则会显示svn: E205009: 本地非提交操作不需要日志消息或修订属性。*(我替换了地址,但它们确实存在,除了新分支目录和整个路径+URL,这是 SVN 出现错误的原因)*。 - Hi-Angel
好的,下面的答案有效。我猜svn cp == svn copy,所以这个答案中的svn+ssh部分是错误的,它不起作用(会触发上述错误↑)。 - Hi-Angel

376

Subversion提供了一种非常轻便高效的复制工具来实现分支功能。

分支和标记本质上是相同的。只需使用svn copy命令将存储库中的整个文件夹复制到存储库中的其他位置即可。

基本上这意味着按照约定,复制文件夹表示什么意思--无论是备份、标记、分支还是其他。根据您想要如何考虑问题(通常取决于您过去使用的SCM工具),您需要在存储库中设置一个文件夹结构以支持您的风格。

常见的做法是在存储库的顶部有一堆名为tags, branches, trunk等的文件夹,这使您可以将整个trunk(或子集)复制到tags和/或branches文件夹中。如果您有多个项目,您可能希望在每个项目下复制此类结构:

要习惯这个概念可能需要一段时间,但它确实有效 - 只需确保您(和您的团队)清楚了解您将要使用的约定即可。还有一个好主意是采用良好的命名约定 - 这样可以告诉您为什么创建了分支/标记以及它是否仍然合适 - 考虑归档已过时的分支。


220
"svn copy"有一个优点,就是在分支之前可以保留历史记录。手动复制到另一个目录则没有这个功能。 - WhyNotHugo
6
请注意,对“trunk”的子目录进行标记或分支通常是个不好的主意。这会使跟踪分支的子目录变得困难,并且大多数工具会因这些分支而混淆不清(例如,切换分支将导致WC的目录结构发生变化,这将混淆IDE和构建工具)。请始终对“trunk”进行分支。 - sleske
3
实际上,svn cp 使用廉价副本进行分支操作,而不是复制实际的文件。请参见 http://svnbook.red-bean.com/en/1.1/ch04s02.html。 - Walty Yeung

42

如果你的仓库可以通过https访问,你可以使用这个命令分支...

svn copy https://host.example.com/repos/project/trunk \
       https://host.example.com/repos/project/branches/branch-name \
  -m "Creating a branch of project"

27
svn cp /trunk/ /branch/NEW_Branch

如果您在主干中有一些本地更改,则使用Rsync同步更改。

rsync -r -v -p --exclude ".svn" /trunk/ /branch/NEW_Branch

2
在这种情况下,没有必要使用rsync。svn cp同样可以复制任何本地更改。 - Kevin Panko
@KevinPanko 它不会复制未提交的更改。 - Parag Bafna
5
确认了使用svn版本1.8.5,功能有效。 - Kevin Panko
我在想这个。这似乎是最简单的选择,而且据我回忆,这就是我3年前使用SVN时所做的。但是这种方法与直接使用服务器URL的方法有什么区别呢? - oligofren
@KevinPanko 你知道它是否也会复制新创建的文件吗? - John Hamilton

17

假设您想从主干名称(如“TEST”)创建一个分支,则可以使用:

svn cp -m "CREATE BRANCH TEST" $svn_url/trunk $svn_url/branches/TEST

17

给新的SVN用户的顶级提示; 这可能会有助于快速获取正确的URL。

运行svn info以显示有关当前签出分支的有用信息。

如果您在根文件夹中运行svn,则应该(如果您在根文件夹中运行svn)提供您需要复制的URL。

另外,要切换到新创建的分支,请使用svn switch命令:

svn switch http://my.repo.url/myrepo/branches/newBranchName

4
你可以使用符号 ^ 代替代码库的根目录。 - chim

15

通常你会将它复制到svn+ssh://host.example.com/repos/project/branches/mybranch,以便您可以在仓库中保留多个分支,但是您的语法是有效的。

这里有一些建议,关于如何设置您的仓库布局


12

如果你打算合并你的分支,我强烈建议你查看这个链接:

Svnmerge.py

我听说Subversion 1.5构建了更多的合并跟踪功能,但我没有经验。我的项目使用的是1.4.x版本,而svnmerge.py简直是救星!


6
  • 在当前项目之外创建一个新文件夹,可以随意命名。(例如:您有一个名为“Customization”的项目的结帐,并且它有许多项目,如“Project1”,“Project2”....您想创建“Project1”的分支。因此,首先打开“Customization”,右键单击并创建一个新文件夹,然后给它命名为“Project1Branch”)。
  • 右键单击“Myproject1”....TortoiseSVN -> Branch/Tag。
  • 选择工作副本。
  • 打开浏览器...在“To URL”上的平行线的右侧。
  • 选择自定义.....右键单击,然后添加文件夹。通过您创建的文件夹进行操作。这里是“Project1Branch”。现在单击确定按钮以添加。
  • 取出此新分支的检出。
  • 再次转到要创建分支的项目。右键单击TorotoiseSVN -> branch/tag。然后选择工作副本。您可以将URL设置为分支名称。例如{您的IP地址/svn/AAAA/Customization/Project1Branch}。您可以在URL中设置名称,因此它将仅创建具有此名称的文件夹。像{您的IP地址/svn/AAAA/Customization/Project1Branch/MyProject1Branch}。
  • 按下确定按钮。现在您可以在...您的工作副本将存储在您的分支中。
  • 现在您可以进行检查......让您享受工作。:)

4
以下是使用TortoiseSVN在Windows机器上从主干创建分支的步骤。显然需要先安装TortoiseSVN客户端。
  1. 从本地Windows机器上右键单击已更新的主干
  2. 选择TortoiseSVN
  3. 点击分支/标签
  4. 选择SVN存储库中的目标路径。请注意,目标URL根据给定的路径和分支名称进行更新
  5. 不要在存储库浏览器中创建分支内部的文件夹
  6. 添加分支路径。例如,分支 /
  7. 为您的参考添加有意义的日志消息
  8. 单击确定,这将在本地系统上创建一个新文件夹
  9. 将创建的分支检出到新文件夹中

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接