当我正在进行TortoiseSVN合并时,它包含一堆目录,并且一些文件包含在已修改的文件中,即使没有实际更改.
它改变了财产svn:mergeinfo
.
是否有任何理由需要在目录/文件上设置这些属性?有没有办法绕过不做这些改变svn:mergeinfo
?
我通常只是恢复项目然后提交,但这浪费了额外的时间.
这很可能发生,因为这些文件和目录具有从先前合并设置的svn:mergeinfo属性.我认为以一种导致将mergeinfo写入单个文件的方式合并单个文件或目录通常不是一个好主意.您应该养成在工作流可能的最高级别合并的习惯,以便mergeinfo属性仅在结构目录上设置,例如/ trunk或/branches/1.0.
但是,如果您发现自己在单个文件和文件夹上使用mergeinfo属性,则可以执行以下两项操作:首先,只需从相关文件和目录中删除svn:mergeinfo属性即可.我不确定这是推荐的,除非你真的知道你在做什么,以及可能产生的影响.在执行此操作之前,请阅读文档!
您可以做的第二件事是按照SVN要求的方式提交属性更改,如果您信任该软件,则可能是正确的做法.
话说回来,我一直在与队友一起养成正确的习惯,这样我们就不再有这种烦恼了.
这应该在SVN 1.7中修复.从发行说明:
如果子树不受合并影响,则合并不再在子树(具有其自己的显式mergeinfo)上记录mergeinfo(描述合并).
svn:mergeinfo
对于具有显式mergeinfo的大量子树的用户,这应该会大大减少虚假属性更改的数量.
发生的情况是,一旦文件/文件夹具有显式mergeinfo,即使文件/文件夹不相关,每次后续合并到分支也将更新该mergeinfo.这很烦人,因为它在每个合并的更改列表中引入了越来越多的混乱.
为避免这种情况,只能合并到分支的"root"文件夹,例如"/branches/maintenance2.x"."/branches/maintenance2.x"下面的文件或文件夹都不应该获得mergeinfo.遵循SVN书中的合并建议.
不幸的是,即使您仅在分支的"根"文件夹中进行合并,在复制时,空svn:mergeinfo
属性仍然可以显示在单个文件和文件夹上,以指示它们没有收到与其兄弟姐妹相同的合并.
删除多余的子树mergeinfo可能是安全的.一种方法是通过递归删除svn:mergeinfo
项目根目录中每个文件和文件夹的属性.(但是将mergeinfo保留在根文件夹本身!)
或者,您可以升级到Subversion 1.6.我已经确认它解决了这个问题.它甚至似乎删除了早期版本为您添加的多余合并信息.
从评论来看,SVN 1.6中仍然存在多余的子树mergeinfo出现的情况.但我无法重现这一点.
如果使用--ignore-ancestry选项进行合并,则不会首先创建mergeinfo属性.
svn merge --ignore-ancestry -c 1234 svn://sourcecontrol .
如果勾选忽略祖先,它将不会在文件夹中创建svn mergeinfo.如果你已经获得了svn合并信息,只需恢复它并通过检查ignore ancestry再次进行合并.