当我在进行TortoiseSVN合并时,它会将一堆目录和一些文件包含到已修改的文件中,即使实际上没有任何更改。
它会改变属性svn:mergeinfo
。
这些设置在目录/文件上的属性是否有必要?有没有办法避免对 svn:mergeinfo
做出这些更改?
我通常只是还原项目然后提交,但这会浪费额外的时间。
当我在进行TortoiseSVN合并时,它会将一堆目录和一些文件包含到已修改的文件中,即使实际上没有任何更改。
它会改变属性svn:mergeinfo
。
这些设置在目录/文件上的属性是否有必要?有没有办法避免对 svn:mergeinfo
做出这些更改?
我通常只是还原项目然后提交,但这会浪费额外的时间。
这种情况很可能是因为这些文件和目录从之前的合并中设置了svn:mergeinfo属性。我认为以一种导致mergeinfo写入单个文件的方式合并单个文件或目录通常不是个好主意。你应该养成尽可能在工作流程的最高级别上合并的习惯,这样mergeinfo属性只会在结构目录上(例如/trunk或/branches/1.0)设置。
但是,如果您发现在单个文件和文件夹上具有 mergeinfo 属性,则有两件事情可以做:第一件事情是仅从相关文件和目录中删除 svn:mergeinfo 属性。我不确定除非您确实知道自己在做什么以及可能产生的影响,否则不建议这样做,请在这样做之前阅读文档!
你可以做的第二件事是按照SVN所要求的方式承诺属性更改,如果你相信这个软件,这可能是正确的做法。
话虽如此,我一直与我的团队合作,养成良好的习惯,以便我们不再受到这种烦恼。
这个问题应该在SVN 1.7中得到解决。从发布说明中得知:
如果子树未受合并影响,则合并不再记录子树上的合并信息(描述合并)。对于具有自己的显式合并信息的大量子树的用户,这应该会大大减少虚假的
svn:mergeinfo
属性更改的数量。
What happens is that once a file/folder has explicit mergeinfo, each subsequent merge to the branch will update that mergeinfo even if the file/folder is unrelated. This is annoying as it introduces more and more clutter in the changelist for each merge.
To avoid this, only merge to the "root" folder of the branch, for example "/branches/maintenance2.x". None of the files or folders below "/branches/maintenance2.x" should then get mergeinfo. Follow the merging advice in the SVN book.
Unfortunately, even if you merge only at the "root" folder of the branch,
empty svn:mergeinfo
properties can still appear on individual files and
folders when they are copied, to indicate that they have not received the
same merges as their siblings.
可能安全地删除多余的子树合并信息。一种方法是对项目根目录中的每个文件和文件夹进行递归删除svn:mergeinfo
属性。(但是保留根文件夹上的合并信息!)
或者,您可以升级到Subversion 1.6。我已验证它可以解决此问题。甚至似乎可以自动删除早期版本添加的多余合并信息。
根据评论,SVN 1.6仍有一些超出需求的子树合并信息出现。但我无法复制那样的情况。
如果您使用“--ignore-ancestry”选项进行合并,则合并信息属性将不会首先创建。
svn merge --ignore-ancestry -c 1234 svn://sourcecontrol .
如果勾选了忽略祖先,则不会在文件夹中创建svn合并信息。如果已经获取了svn合并信息,则只需撤消它并通过勾选忽略祖先再进行合并即可。
将此翻译成中文:
svn:mergeinfo是Subversion用来跟踪合并历史的属性。我只是让它做它该做的事情...您以后可能需要合并历史记录并发现它不起作用,因为您没有提交这些属性。
在 Stack Overflow 问题 删除不必要的 svn:mergeinfo 属性 中给出的命令将删除任何额外的合并信息。
From the root of the project do:
svn propdel svn:mergeinfo -R
svn revert .
svn ci -m "Removed mergeinfo"
我想补充一下,至少这个问题的一个部分已经在Subversion 1.5.5中得到修复。从1.5.5 CHANGES文件可以看到:
do not create mergeinfo for wc-wc moves or copies (r34184, -585)
也就是说,在SVN 1.5之前存在一个错误,它会创建它没有使用且多余的合并信息条目,如果原始问题提问者有大量的svn:mergeinfo
属性,那么很可能就是这个问题。
我们在项目中递归地删除了它,因为几乎所有的文件都有这个信息,这使得合并非常烦人(如果只有一个文件被更改,所有文件都必须被合并)。 从现在开始,我们只会在根目录上合并,这应该可以避免这种情况。
到目前为止,它还没有给我们带来任何问题。文件仍然可以记录,而且似乎是相同的(但无论如何请自行决定风险)。
噢,我们是在创建新的分支之前在我们的主干上完成的。这样,我们就可以从清白的状态开始。
We also had this problem in my team, and it made the whole merge process a bit confusing. After reading this, I tried deleting the svn:mergeinfo property from a number of files, and after some further testing it looks like that solved the problem.
很棒的问题与答案!最近我们一直在遇到这个问题,因为我们试图绕开自动化构建系统的限制。我们的构建系统会自动增加版本和路径信息到 .bdsproj 和一些 .dpr/.dpk 文件中。
I want to change that... but right now, if you want to merge one branch with another, you get the handful of files that you changed, and then 1000 files that the build machine changed. So we ve been doing "targeted" merges, sometimes a file at a time. Especially with .dpr or .bdsproj files that have legitimate changes (such as the inclusion of an extra unit). Now I know what s going on, so I can hopefully put a stop to the madness.
谢谢 Stack Overflow!