当我正在进行TortoiseSVN合并时,它包含一堆目录,并且一些文件包含在已修改的文件中,即使没有实际更改。
它会更改属性svn:mergeinfo
。
是否有任何理由需要在目录/文件上设置这些属性?有没有办法绕过不对svn:mergeinfo
进行这些更改?
我通常只是将项目还原然后提交,但这会浪费额外的时间。
答案 0 :(得分:44)
这很有可能发生,因为这些文件和目录具有从先前合并设置的svn:mergeinfo属性。我认为以一种导致将mergeinfo写入单个文件的方式合并单个文件或目录通常不是一个好主意。您应该养成在工作流可能的最高级别合并的习惯,以便mergeinfo属性仅在结构目录上设置,例如/ trunk或/branches/1.0。
但是,如果您确实发现自己在单个文件和文件夹上使用mergeinfo属性,那么您可以做两件事:第一件事就是从相关文件和目录中删除svn:mergeinfo属性。我不确定这是推荐的,除非你真的知道你在做什么,以及可能产生的影响。在执行此操作之前,请阅读文档!
你可以做的第二件事是按照SVN要求的方式提交属性更改,如果你信任该软件,可能是正确的做法。
话说回来,我一直在与队友一起努力养成正确的习惯,这样我们就不会再烦恼了。
答案 1 :(得分:38)
这应该在SVN 1.7中修复。来自the release notes:
如果子树不受合并的影响,则合并不再在子树(具有自己的显式mergeinfo)上记录mergeinfo(描述合并)。对于具有显式mergeinfo的大量子树的用户,这应该会大大减少虚假
svn:mergeinfo
属性更改的数量。
一旦文件/文件夹具有显式的mergeinfo,每个都会发生什么 后续合并到分支将更新该mergeinfo即使 文件/文件夹无关。这很烦人,因为它引入的越来越多 每次合并的变更清单都是混乱的。
为避免这种情况,例如,仅合并到分支的“root”文件夹 “/branches/maintenance2.x”。下面没有任何文件或文件夹 然后“/branches/maintenance2.x”应该获得mergeinfo。关注merging advice in the SVN book。
不幸的是,即使您仅在分支的“根”文件夹中合并,
空的svn:mergeinfo
属性仍然可以出现在单个文件中
文件夹复制时,表示他们没有收到
与他们的兄弟姐妹一样合并。
删除多余的子树mergeinfo可能是安全的。一种方法是通过递归删除项目根目录中每个文件和文件夹的svn:mergeinfo
属性。 (但是将mergeinfo保留在根文件夹本身!)
或者,您可以升级到Subversion 1.6。我已经确认它解决了这个问题。它甚至似乎删除了早期版本为您添加的多余合并信息。
从评论来看,SVN 1.6中仍然存在多余的子树mergeinfo出现的情况。但我无法重现这一点。
答案 2 :(得分:14)
如果使用--ignore-ancestry选项进行合并,则不会首先创建mergeinfo属性。
svn merge --ignore-ancestry -c 1234 svn://sourcecontrol .
答案 3 :(得分:6)
如果勾选忽略祖先,则不会在文件夹中创建svn mergeinfo。如果你已经获得了svn合并信息,只需恢复它并通过检查忽略祖先再次进行合并。
答案 4 :(得分:3)
svn:mergeinfo是Subversion用于track merge history的属性。我只是让它做它必须做的事情......你可能需要稍后进行合并历史跟踪,并发现它不起作用,因为你没有提交这些属性。
答案 5 :(得分:2)
Stack Overflow问题Remove unnecessary svn:mergeinfo properties中给出的命令将删除任何额外的mergeinfo。
From the root of the project do:
svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"
答案 6 :(得分:1)
我想补充一点,在Subversion 1.5.5中修复了这个bug的至少一部分。来自1.5.5 CHANGES file:
do not create mergeinfo for wc-wc moves or copies (r34184, -585)
也就是说,在1.5之前的SVN中存在一个错误,它会创建它没有使用的mergeinfo条目,并且是多余的,这可能是原始提问者如果有很多{{{{{{ 1}}属性。
答案 7 :(得分:0)
我们在项目中递归删除了它,因为几乎所有文件都有这个信息使得合并非常烦人(如果只有一个文件被修改,所有文件都必须合并)。从现在开始,我们只会合并到根目录,这将在未来避免这种情况。
到目前为止,它没有给我们任何问题。记录仍然可用于文件,并且似乎是相同的(但无论如何都要自行承担风险!)。
哦,我们在我们的行李箱上做了,就在创建一个新的分支之前。这样,我们就可以从一个清白的板岩开始。
答案 8 :(得分:0)
很棒的问题和答案!我们最近遇到了这个问题,因为我们正试图解决自动构建系统的局限性。我们的构建系统使用版本和路径信息自动增加.bdsproj和一些.dpr / .dpk文件。
我想改变它......但是现在,如果你想将一个分支与另一个分支合并,你会得到你改变的少数文件,然后是构建机器改变的1000个文件。所以我们一直在进行“有针对性”的合并,有时候是一个文件。特别是对于具有合法更改的.dpr或.bdsproj文件(例如包含额外单元)。 现在我知道发生了什么,所以我希望能够制止这种疯狂。
谢谢Stack Overflow!
答案 9 :(得分:0)
我的团队也遇到了这个问题,这使得整个合并过程有点混乱。 阅读本文之后,我尝试从多个文件中删除svn:mergeinfo属性,经过一些进一步的测试后,看起来就解决了这个问题。