为什么我在Subversion中发生树冲突?
我有一个我的树干function分支,并正在合并从我的树干变化到我的分支定期和一切工作正常。 今天,我去分支合并到树干,创build我的分支后,添加到我的树干的任何文件被标记为“树冲突”。 将来有没有办法避免这种情况?
我不认为这些被正确标记。
我发现解决scheme阅读加里给的链接(我build议按照这种方式)。
总结解决树型冲突提交您的工作目录与SVN客户端1.6.x您可以使用:
svn resolve --accept working -R .
哪里.
是冲突的目录。
警告 : “提交你的工作目录”意味着你的沙盒结构将是你正在提交的沙盒结构,所以如果你从沙盒中删除了一些文件,它们也将被从存储库中删除。 这仅适用于冲突的目录。
这样,我们build议SVN解决冲突( --resolve
),从当前目录( .
)开始recursion地( -R
)接受沙箱内的工作拷贝( --accept working
)。
在TortoiseSVN中,右键单击select“已解决”,实际上解决了这个问题。
Subversion 1.6添加了Tree Conflicts来覆盖目录级的冲突。 一个很好的例子就是当你在本地删除一个文件,然后一个更新尝试在文件上改变文本。 另一个是当你有一个颠覆重命名你正在编辑的文件,因为这是一个添加/删除操作。
CollabNet的Subversion博客上有一篇关于树冲突的文章。
我不知道这是否发生在你身上,但有时我select错误的目录进行合并,即使所有文件都显示完全正常,我也会得到这个错误。
例:
合并/ svn /项目/分支机构/一些分支/来源到/ svn /项目/树干—>树冲突
将/ svn / Project / branches / some-branch合并到/ svn / Project / trunk —> OK
这可能是一个愚蠢的错误,但并不总是显而易见的,因为你认为它更复杂。
根据我的经验,SVN创build树冲突WHENEVER我删除一个文件夹。 似乎没有理由。
我是唯一一个在我的代码上工作 – >删除一个目录 – >提交 – >冲突!
我等不及要切换到Git 。
我应该澄清 – 我使用Subclipse 。 这可能是问题! 再次,我等不及要切换…
这里发生的事情如下:你在你的trunk上创build一个新文件,然后把它合并到你的分支中。 在合并提交中,这个文件也将在你的分支中创build。
当你将你的分支合并到主干时,SVN会再次尝试:在分支中创build一个文件,并尝试在合并提交中在主干中创build它,但它已经存在! 这造成了树冲突。
避免这种情况的方法是做一个特殊的合并, 重新整合 。 您可以使用--reintegrate
开关实现此--reintegrate
。
你可以在文档中阅读这个: http : //svnbook.red-bean.com/en/1.7/svn.branchmerge.basicmerging.html#svn.branchemerge.basicmerging.reintegrate
然而,当你的分支合并到树干时,底层math是完全不同的。 你的function分支现在是重复树干更改和私人分支更改的混杂,所以没有简单的连续范围的修订复制。 通过指定–reintegrate选项,你可以让Subversion仔细地复制你的分支独有的改变。 (事实上,它通过比较最新的树干树与最新的树枝树来实现这一点:所得到的差异正是您的树枝改变!)
重新集成一个分支之后,强烈build议将其删除,否则每当在另一个方向上合并时:从树干到分支,您都会继续收到树冲突。 (与前面所述的原因完全相同)
还有一个办法,但我从来没有尝试过。 你可以在这篇文章中阅读: v1.6中的Subversion分支重新集成
这可能是由于不使用相同版本的客户端而造成的。
使用版本1.5客户端和版本1.6客户端对同一个存储库可能会造成这种问题。 (我只是咬自己。)
如果遇到由于没有编辑/删除/到达文件附近的任何地方而造成的树冲突,那么在合并命令中出现错误的可能性也很大。
可能发生的情况是,您之前已经合并了您当前合并中包含的一系列更改。 例如,在主干中,某人编辑了一个文件,然后重命名它。 如果你在第一次合并你包括编辑,然后在第二次合并包括编辑和重命名(本质上是删除),它也会给你一个树冲突。 这样做的原因是之前合并的编辑出现在你自己的,因此删除将不会自动执行。
这至less可以在1.4版本库上发生,我不确定在1.5中引入的合并跟踪是否有帮助。
我今天也遇到过这个问题,虽然我的问题可能跟你的问题没有关系。 在检查完文件列表之后,我意识到自己做了什么 – 我暂时从另一个程序集的一个程序集中使用了一个文件。 我做了很多改变,并不想孤儿SVN的历史,所以在我的分支,我已经从另一个程序集的文件夹移动文件。 这不是由SVN跟踪,所以它看起来像文件被删除,然后重新添加。 这最终导致树冲突。
我通过移回文件,提交, 然后合并我的分支解决了问题。 之后我把文件移回去了。 :)这似乎是伎俩。
我有一个类似的问题。 实际上,我唯一能做的就是删除冲突的子目录:
svn delete --force ./SUB_DIR_NAME
然后从工作副本中的另一个根目录中再次复制它们,其中包含:
svn copy ROOT_DIR_NAME/SUB_DIR_NAME
然后做
svn cleanup
和
svn add *
你可能会得到最后一个警告,但只是忽略它们,最后
svn ci .
我遇到了同样的问题,并通过使用这些指令重新进行合并来解决此问题。 基本上,它使用SVN的“2-URL合并”来更新trunk
到你的分支的当前状态,而不会打扰那么多历史和树的冲突。 救了我从手动修复114树的冲突。
我不确定它是否保留了历史,也不是我想要的,但对我来说这是值得的。
我有时遇到的情况是:
假设你有一个主干,从中你创build了一个发布分支。 在trunk上进行了一些修改(尤其是创build“some-dir”目录)之后,您将创build一个function/修复分支,以便以后合并到发行分支中(因为修改足够小,function/修复对于发行很重要) 。
trunk -- ... -- create "some-dir" -- ... \ \-feature/fix branch \- release branch
如果您尝试直接将function/修复分支合并到发布分支中,则会发生树冲突(即使该function/修复分支中不存在该目录):
svn status ! C some-dir > local missing or deleted or moved away, incoming file edit upon merge
因此,在合并特性/修复分支之前,需要明确合并在主干上创build的“创build特性/修复”分支之前创build“some-dir”目录的提交。
我经常忘记,因为这是没有必要的混帐。