SVN分支问题

4

创建分支时,选择以下内容会有什么影响:

从存储库中创建副本:

  • 从存储库中的HEAD修订版本
  • 从存储库中的特定修订版本
  • 从工作副本中
4个回答

4
简而言之:
  • 从HEAD版本创建是从“现在”开始创建分支,其中“现在”是提交到仓库的最新版本
  • 从特定版本创建是从过去某个点(由其修订号标识)开始创建分支
  • 从工作副本创建有点像从未来某个点(您的尚未提交的工作副本)开始创建分支

根据创建分支的目的,通常会选择前两个选项中的一个。第三个选项可能较少使用。

如果要为特定目的进行一些探索性开发,或者要开始为特定客户端创建不同版本,则应从HEAD进行分支。如果需要对先前发布的软件版本进行补丁,则应从过去进行分支。


感谢您的详细描述,Greg ;) - Theomax

1

在 SVN 中,“创建分支”实际上只是复制存储库的某个子集。事实上,SVN 书中的章节branching says as much 就是这样描述的。

如果你的目录结构如下所示:

  • 项目
    • 主干
    • 分支
    • 标签

并且你的主干 URL 是:http://example.com/repos/project/trunk,那么你应该:

  1. 从HEAD创建一个名为beta的新分支,如下所示:

    svn copy http://example.com/repos/project/trunk http://example.com/repos/project/branches/beta
    

    这将立即在仓库中创建新分支,并不会对您的本地副本做任何事情。

  2. 从旧版修订号n创建一个名为ancient的新分支,如下所示:

    svn copy -r n http://example.com/repos/project/trunk http://example.com/repos/project/branches/ancient
    

    这与1完全相同,但使用特定的修订号。

  3. 从您的本地复制品创建一个名为alpha的分支,假设您的当前目录是trunk

    cd ../
    svn cp trunk branches/alpha
    

    这将创建您请求的副本,但是在本地执行。根据SVN手册的说明,这是不鼓励的,因为它比在仓库服务器上制作副本要花费更长的时间(在那里复制操作基本上是免费的)。

    当您键入svn help copy时,还列出了以下警告:

    警告:为了与Subversion的先前版本兼容, 使用两个工作副本路径(WC-> WC)执行的复制操作不会 联系存储库。因此,默认情况下,它们可能无法 将源的合并跟踪信息传播到目标。

根据我的经验,通常使用方式1。在某些罕见情况下,涉及到早期分支的复杂补丁时会使用2,而3则从未有用过(并且根据文档,它还可能很慢,甚至危险)。因此,除非您有充分的理由使用其他两种方法之一,否则请坚持使用1

1

代码库中的HEAD版本 SVN会选择最高编号的版本,也就是最后上传的版本。

指定代码库中的特定版本 您可以选择要获取的特定版本。

工作副本 当前在您本地工作区中的版本(未提交)。


在什么情况下会使用工作副本?既然最好获取最新的代码? - Theomax
您可以使用此选项在您的工作区中共享某些内容(例如,让同事再次查看或继续处理),这些内容尚未经过完全测试,因此不应上传到真正的svn分支中。 为了获取最新的已成功测试的代码,我会将其上传到存储库并从头版本创建分支,以便您获得所有100%的更改。 - Matschie

1

HEAD 会使分支成为仓库最新提交版本的副本。

指定修订版会使分支成为仓库特定时间点的副本。

工作副本会基于您的工作副本的最新修订版创建一个分支,然后将您所有“正在进行中”的更改提交到此分支。

编辑: 选择工作副本的示例。

您使用主干的最新版本更新您的工作副本以开始进行一些小的更改。

几个小时后,您意识到这项工作比您预期的要大,您应该创建一个分支。

此时从工作副本创建分支实际上就像在一开始就这样做一样。


谢谢Robin。我想,当您对创建的分支进行更改并提交更改后,要将这些更改添加到主干中,您需要删除文件,然后检入来自主干的文件,然后使用类似Beyond Compare的工具将文件添加到刚刚检入的主干文件中,是吗? - Theomax
不,完全不需要。你可以将你的修改合并回主干。通常情况下,你会将主干上的任何改动都合并回你的分支,以保持同步。然后你再将你的分支重新整合回主干。关于整个分支/合并概念,这是一个完全不同的问题,无法在评论中完全回答。 - Robin Day
我在我的写作中将选项3称为“可能危险”,但在这种情况下,我认为这是可以的。只要在进行本地复制时没有遗漏任何svn:mergeinfo属性,您就应该没问题。由于这是将全新的工作复制到新分支的示例,我不认为文档中的警告适用于此处。 - jasonmp85

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