Subversion:我能够检出、修改,然后将其变为分支吗?

80

我从主干(trunk)检出(checkout)到一个本地目录(DIR),并在那里进行了许多本地更改。现在我不想将其提交回主干(trunk),而是想从这个本地版本创建一个分支(branch)。这可能吗?

我可以只是将主干(trunk)复制到一个分支(branch)中,然后cd DIRsvn switch到分支(branch)中吗?

更新(UPDATE): 感谢答案,它起作用了!总结一下步骤:

  • cd DIR
  • svn copy . 新分支的URL
  • svn switch 新分支的URL .

(注意点号)


可以的。我使用TortoiseSVN,你可以在那里完成它。 - Nick
我发现使用 svn switch 会出现太多冲突,所以我选择在 svn copy 后从 new-branch-URL 检出新的副本。 - fikr4n
4个回答

52

《SVN Book》(http://svnbook.red-bean.com/en/1.6/svn-book.html#svn.branchmerge.using.create) 不建议从本地工作副本创建分支。

虽然也可以使用 svn copy 命令在工作副本中复制目录以创建分支,但这种技术不被推荐。实际上,它可能相当慢!在客户端复制目录是一个线性时间操作,因为它实际上需要在本地磁盘上复制该工作副本目录中的所有文件和子目录。

相反的,首先创建分支,然后使用 svn switch 命令,以便能够提交您的更改。如果您的工作副本与主干显着过时,则在源URL后面添加 "@REV",其中 "REV" 是由 svn info 报告的您工作副本的版本。

在服务器上复制目录是一个常数时间操作,这是大多数人创建分支的方式。

$ svn copy http://svn.example.com/repos/calc/trunk \
           http://svn.example.com/repos/calc/branches/my-calc-branch \
      -m "Creating a private branch of /calc/trunk."

2
谢谢您的答案。这是更好的解决方案,因为它保留了修订历史记录。 - evanflash
3
这是否意味着如果我在本地的工作副本中进行了更改,我可以使用svn copy <trunk-URL> <newBranch-URL> 将主干复制到svn服务器上的新分支,然后在我的工作副本中使用 svn switch 切换到新分支而不会丢失任何更改?或者切换会使我的未提交的修改文件消失吗? - Kasapo
3
@Kasapo,是的,没错。还需要注意的是,如果你的源代码与主分支不同步,请按照我提供的方式在源URL后添加"@REV",这样在切换到分支后,只有你本地的更改会显示为差异。 - Lucas
让我添加一个非常有用的链接,更详细地解释了卢卡斯的解决方案:http://svnbook.red-bean.com/en/1.6/svn.branchmerge.switchwc.html(查看底部的信息框)。这确实是从本地修改创建分支的最清洁和最方便的解决方案。 - Spiros

39
根据它的命令行帮助,svn copy 可以从一个目录复制到一个存储库URL。因此,您应该能够将您的工作副本复制到分支,例如:
svn copy working_directory url_to_branch

9
在我的SVN客户端TortoiseSVN中,只需要执行以下步骤即可完成分支操作:
  • 右键单击要分支的顶级目录
  • 在“到URL”中选择存储库中的分支目录
  • 在“从以下位置创建副本:”框中选择“工作副本”
完成 :)
这就像将本地版本复制到指定的存储库URL。

1

是的,您可以通过SVN命令行tortoiseSVN来实现。

您需要将您的SVN工作副本指定为源(src),将新分支指定为目标(destination)。

svn copy <file/path/to/working/copy> <URL/TO/REPOSITORY/BRANCH>

命令。

在TortoiseSVN中,只需指向您的工作副本,从上下文菜单中选择“分支/标记”,并在“从以下位置创建存储库的副本:”部分中选择“工作副本”

请注意,出于可追溯性的原因,以这种方式创建标记不是一个好主意,但对于分支来说完全没问题。


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