在SVN子目录上提交和合并被认为是有害的吗?

时间:2009-04-16 20:05:06

标签: svn merge tortoisesvn svn-merge

我们的主要SVN项目根目录中有几个大型子项目

,我在处理发布分支时只提交和合并我的子项目,主要是因为它更快。

然而,一位同事指出了reference to merging subdirectories in Version Control with Subversion(a.k.a“The SVN Book”):

  

不幸的是,这是警告的程度。链接部分也没有给出解释。

提交和合并SVN子目录对发布分支有害吗?
那么短命的特征分支呢?

4 个答案:

答案 0 :(得分:14)

一种可能的解释是您可能会忘记更改集的部分内容。

如果更改设置您正在合并已检出的子目录之外的封面文件,那么您可能会忘记合并这些文件。

例如,如果你在trunk上有这样的提交:

r5 | rich | 2009-04-16 22:22:46 +0200 (Thu, 16 Apr 2009) | 2 lines
Changed paths:
   M /trunk/subdir1/main.c
   M /trunk/subdir2/main.c

Change some stuff

然后您从分支“stable”中检出subdir1,然后您可以合并更改集r5,如下所示:

$ svn co http://example.com/svn/branches/stable/subdir1
$ cd subdir1
$ svn merge -c 5 http://example.com/svn/trunk/subdir1 .
--- Merging r5 into '.':
U    main.c
$ svn ci -m"Merged r5 from trunk"

但这只会合并修订版5的一半。更糟糕的是,如果你回头查看日志,它现在会显示:

$ svn log -g http://example.com/svn/
...
------------------------------------------------------------------------
r5 | rich | 2009-04-16 22:22:46 +0200 (Thu, 16 Apr 2009) | 2 lines
Changed paths:
   M /trunk/subdir1/main.c
   M /trunk/subdir2/main.c
Merged via: r6

Change some stuff

所以看起来你已经合并了整个提交,而实际上你只合并了一些提交。当然r6确实显示稳定分支上只有1个文件发生了变化。

------------------------------------------------------------------------
r6 | rich | 2009-04-16 22:28:16 +0200 (Thu, 16 Apr 2009) | 1 line
Changed paths:
   M /branches/stable/subdir2
   M /branches/stable/subdir2/main.c

Merge revision 5 from trunk

有人必须记住或注意到只有部分变更集合并而其余部分需要合并。不使用子目录合并可以避免此问题。

有时您真的不想合并以前的所有提交,而上述方案正是您打算做的。在这种情况下,最好添加一个描述您意图的良好提交消息。

答案 1 :(得分:6)

另一个原因可能是仅合并到root限制了将在存储库中的文件夹/文件上设置的svn:mergeinfo属性的数量。

答案 2 :(得分:1)

提交不应该有问题,但在合并中SVN会跟踪合并的内容。

因此我假设你想在根目录下合并以简化未来的合并(就SVN比较的数据集大小而言)。

答案 3 :(得分:1)

对于1.5之前的subversion版本,合并子目录使得后来目录树其余部分的合并变得非常复杂。 如果合并了一个目录,则svn只是将该目录中所做的所有更改应用到另一个分支。如果您已经合并了一个子目录,然后尝试合并主目录,则子目录中的所有更改都已经在目标分支中(因为您之前已将它们合并)。 Svn现在不知道这些更改是来自之前的合并,它只是看到当它试图合并子目录时有“阻碍”,导致很多冲突。

为避免这种情况,您必须注意只合并之前未合并的目录,从而使整个过程变得更加复杂。您必须准确记住已合并的子目录的哪些修订,并仅应用剩余目录/修订的其余更改。这可能会让人感到困惑。始终合并整个分支使这更容易。当前版本的subversion在内部跟踪先前的合并,因此可以避免这些问题。

提交子目录没问题。对于svn,这只是存储库的正常全局修订版。在该修订版中,只有一个子目录中的更改,但对于svn,它仍然是整个存储库的新版本,就像任何其他提交一样。