当我执行TortoiseSVN合并时,即使没有实际更改,它也包含一堆目录和一些文件到修改后的文件中。
它更改属性svn:mergeinfo
。
有什么理由需要在目录/文件上设置这些属性?有什么办法可以避免不做这些更改svn:mergeinfo
?
我通常只还原项目然后提交,但这会浪费额外的时间。
Answers:
这很可能发生,因为这些文件和目录具有先前合并中设置的svn:mergeinfo属性。我认为以使mergeinfo写入单个文件的方式合并单个文件或目录通常不是一个好主意。您应该养成在工作流程中尽可能以最高级别进行合并的习惯,以便只能在结构目录(例如/ trunk或/branches/1.0)上设置mergeinfo属性。
但是,如果确实在单个文件和文件夹上具有mergeinfo属性,则可以执行以下两项操作:第一件事就是简单地从相关文件和目录中删除svn:mergeinfo属性。我不确定是否建议使用此方法,除非您真的知道自己在做什么以及可能会有什么效果。在执行此操作之前,请先阅读文档!
您可以做的第二件事是,提交属性会更改SVN希望您执行的方式,如果您信任该软件,则可能是正确的做法。
话虽如此,我一直在与队友们一起养成正确的习惯,这样我们就不会再有这种烦恼了。
这应该在SVN 1.7中修复。从发行说明中:
如果子树不受合并的影响,则合并不再在子树(具有自己的显式mergeinfo)上记录mergeinfo(描述合并)。
svn:mergeinfo
对于拥有大量带有显式mergeinfo的子树的用户,这将大大减少虚假属性更改的次数。
发生的情况是,一旦文件/文件夹具有显式mergeinfo,即使该文件/文件夹不相关,分支的每个后续合并也会更新该mergeinfo。这很烦人,因为每次合并都会在变更列表中引入越来越多的混乱情况。
为避免这种情况,仅合并到分支的“根”文件夹,例如“ /branches/maintenance2.x”。然后,“ / branches / maintenance2.x”下面的文件或文件夹均不应获取mergeinfo。遵循SVN书中的合并建议。
不幸的是,即使您仅在分支的“根”文件夹中合并,svn:mergeinfo
复制单个文件和文件夹时,空属性仍会出现在各个文件和文件夹上,以指示它们没有收到与其兄弟姐妹相同的合并。
删除多余的子树mergeinfo可能是安全的。一种方法是通过递归删除svn:mergeinfo
项目根目录中每个文件和文件夹的属性。(但将mergeinfo保留在根文件夹本身上!)
另外,您可以升级到Subversion 1.6。我已验证它可以解决此问题。它甚至似乎删除了早期版本为您添加的多余的mergeinfo。
从评论来看,在SVN 1.6中仍然存在多余的子树mergeinfo的情况。但是我无法重现这一点。
svn:mergeinfo是Subversion用于跟踪合并历史记录的属性。我只是让它做它需要做的事情……您可能稍后需要合并历史记录跟踪,并发现它不起作用,因为您没有提交这些属性。
堆栈溢出问题中删除多余的svn:mergeinfo属性中给出的命令将删除所有多余的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之前的版本中存在一个错误,该错误会创建未使用的并没有必要的mergeinfo条目,并且如果它们具有很多svn:mergeinfo
属性,这很可能是原始发问者所想要的。