当我进行TortoiseSVN合并操作时,它会将一些目录和文件包含到修改的文件中,即使实际上没有做任何更改。
它会改变属性svn:mergeinfo
。
这些目录/文件设置的属性是否有必要?是否有方法可以避免对svn:mergeinfo
进行这些更改?
通常我只是还原项目然后提交,但这浪费了额外的时间。
当我进行TortoiseSVN合并操作时,它会将一些目录和文件包含到修改的文件中,即使实际上没有做任何更改。
它会改变属性svn:mergeinfo
。
这些目录/文件设置的属性是否有必要?是否有方法可以避免对svn:mergeinfo
进行这些更改?
通常我只是还原项目然后提交,但这浪费了额外的时间。
这个问题在SVN 1.7中得到了修复。从发行说明中可以看到:
如果子树(具有自己的显式合并信息)未受合并影响,则合并不再记录子树上的合并信息(描述合并)。这应该极大地减少对于拥有大量具有显式合并信息的子树的用户而言,出现虚假
svn:mergeinfo
属性更改的数量。
问题在于,一旦文件/文件夹具有显式的合并信息,每次合并到分支时都会更新该合并信息,即使该文件/文件夹与合并无关也是如此。这很烦人,因为每次合并都会在更改列表中引入越来越多的混乱。
为了避免这种情况,请仅将合并直接放置至分支的“根”文件夹中,例如“/branches/maintenance2.x”。此时,“/branches/maintenance2.x”下的任何文件或文件夹都不应获得合并信息。请遵循SVN书中的合并建议。
不幸的是,即使您仅在分支的“根”文件夹上进行合并,空的svn:mergeinfo
属性仍然会出现在单独的文件和文件夹上,以指示它们未收到与其同级别文件的相同合并。
删除多余的子树合并信息可能是安全的。一种方法是对项目根目录中的每个文件和文件夹进行递归删除svn:mergeinfo
属性。(但请保留根文件夹本身的合并信息!)
或者你可以升级到Subversion 1.6。我已经验证了它可以解决这个问题。似乎它甚至会为你删除早期版本添加的多余合并信息。
从评论中判断,还存在在SVN 1.6中出现多余子树合并信息的情况。但是我无法复现。
如果你使用 --ignore-ancestry 选项进行合并,则合并信息属性将首先不会被创建。
svn merge --ignore-ancestry -c 1234 svn://sourcecontrol .
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"
do not create mergeinfo for wc-wc moves or copies (r34184, -585)
也就是说,在 SVN 1.5 之前存在一个 bug,它会创建一些没有使用且多余的合并信息条目,如果原始提问者有很多 svn:mergeinfo
属性,那么很可能就是这个问题。
很棒的问题和答案!我们最近一直遇到这个问题,因为我们试图解决自动构建系统的限制。我们的构建系统会自动增加版本和路径信息的 .bdsproj 和一些 .dpr/.dpk 文件。
我想改变这种情况...但现在,如果你想将一个分支合并到另一个分支,你会得到你更改的少量文件,以及构建机器更改的1000个文件。所以我们一直在进行“有针对性”的合并,有时是逐个文件地合并。特别是对于那些有合法更改(例如包含额外单元)的 .dpr 或 .bdsproj 文件。 现在我知道了发生了什么,所以我希望能够停止这种疯狂的行为。
感谢 Stack Overflow!
我们在项目中递归地删除了它,因为几乎所有文件都有这些信息,这使得合并非常麻烦(如果只有一个文件被更改,所有文件都必须合并)。从现在开始,我们只会在根目录上进行合并,这样可以避免将来出现这种情况。
到目前为止,它还没有给我们带来任何问题。文件上的日志仍然可用,并且似乎是相同的(但无论如何,请自行承担风险!)。
哦,我们是在新建分支之前对主干进行的操作。这样,我们就可以从干净的状态开始。