Subversion将未修改的文件标记为已修改

30

我在使用Subversion时遇到了一个奇怪的问题:当从开发分支合并到主干(或反过来)时,Subversion会将许多文件标记为已更改,尽管它们没有任何更改。

具体情况如下:

  1. 我在我的分支中提交了1个修改后的文件
  2. 在主干中,我合并了该提交
  3. 很多其他的文件和目录被标记为“修改”,而实际上它们根本没有被更改(甚至空格、换行符、属性等都没有被更改)。

从技术上讲,提交这些未更改的内容不会有任何影响,但我不想在我的日志中添加噪音。

您有什么想法是什么原因导致了这种烦恼,以及如何防止它?我能否询问Subversion为什么标记某个文件已更改,以便我知道它是否是文件内容、属性等引起的?

提示:使用Mac OS X Leopard的Versions.app和CLI结合使用,在1.6.x范围内使用subversion客户端,1.5.x范围内使用服务器。

3个回答

31

当一个文件/文件夹有明确的合并信息(即 svn:mergeinfo 属性)后,每次对分支进行合并时,即使该文件/文件夹与合并无关,也会更新该合并信息。这确实很烦人,因为每次合并都会在更改列表中引入越来越多的杂项。

为避免此问题,只需对分支的“根”文件夹进行合并,例如“/branches/maintenance2.x”。然后,“/branches/maintenance2.x”下面的任何文件或文件夹都不应该获得合并信息。请按照 svn 书籍中的合并建议进行操作。

不幸的是,即使您仅在分支的“根”文件夹处完成合并,当文件或文件夹被复制时,它们可能仍会出现空的svn:mergeinfo属性,以指示它们未收到与其同级别的其他文件相同的合并。

如果您只在根目录合并,则可以安全地删除冗余的子树合并信息。一种方法是对项目根目录中的每个文件和文件夹递归删除svn:mergeinfo属性。


看起来这个问题已在 SVN 1.7 中得到解决。请参阅发布说明: 减少了子树合并信息的更改


你好@Coenen,我提交时可以忽略只显示svn:mergeinfo更改的文件吗?也就是说,我不提交这些文件?这样行得通吗,还是会出问题? - mtk
我正在使用TortoiseSVN。同时,我看到了一个还原文件的选项。我应该使用它吗?我只是在谈论那些实际上没有被修改但在更改列表中显示为“已修改”的文件。 - mtk
@mtk:就像我说的那样,如果你只在项目的根目录合并,那么恢复这些更改可能是安全的。 - Wim Coenen

8
更改在文件属性中。如果运行svn proplist,您会看到很多mergeinfo条目。这是因为svn在文件属性中跟踪合并。这是1.5的新功能,因此在旧版本中不存在。
我从未完全理解这种情况发生的确切原因,但它与内部实现有关。没有理解svn如何实现就试图理解它是不可能的。然而,通常根本原因与子树合并有关。例如,如果您合并子目录或单个文件的更改,而不是整个分支/标记。为了跟踪已合并的内容,Subversion将在最通用的节点上放置mergeinfo属性,但显然它在选择时不够智能。您可以通过手动编辑mergeinfo来解决问题。只需从trunk下面的所有节点中删除该属性,并确保trunk具有其mergeinfo中的所有合并修订版。当然,这意味着您必须确保实际上已经合并了更改。
总之相当令人困惑,但好消息是svn开发人员实际上正在努力使整个过程更加流畅。

2
确认,谢谢。后续问题:为什么这会适用于某些文件而不适用于其他文件?我应该提交这些更改吗? - avdgaag

5

可能是某种属性更改,可能是svn:mergeinfo属性的自动修改。您可以通过运行“svn stat”来确定它是否是属性修改。如果“M”在第一列中,则是内容更改,如果在第二列中,则是属性更改。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接