文件在 SVN 中标记为已修改但没有更改
File flagged as Modified in SVN but no changes
在我的工作场所,我们使用 TortoiseSVN(当前版本为 1.9.6)进行广泛的分支和合并。每隔一段时间,日志中就会出现一个文件,作为合并提交的一部分进行了修改:
>svn log -r 86212 --verbose
------------------------------------------------------------------------
r86212 | user1 | 2018-05-15 16:18:09 -0400 (Tue, 15 May 2018) | 1 line
Changed paths:
M /path/to/file/MySpecialFile.pas
M /path/to/file/ANormalFile.pas
但在 MySpecialFile.pas 中(我发现)完全没有区别。文件属性没有改变,没有空格差异,我们只使用 Windows 操作系统,所以没有理由 Unix/Windows 行尾不匹配。事实上,如果我使用 "Diff with previous version" 选项,它会直接跳过有问题的修订版,使用 SVN diff 也有同样的效果:
>svn diff MySpecialFile.pas -r HEAD:PREV
Index: MySpecialFile.pas
===================================================================
--- MySpecialFile.pas (.../path/to/file/MySpecialFile.pas) (revision 86251)
+++ MySpecialFile.pas (.../path/to/file/MySpecialFile.pas) (revision 83226)
@@ -140,11 +140,11 @@
所以文件在 r86212 中被标记为已修改,但是当我告诉它从 HEAD 到 PREV 时,它比较 r86251 和 r83226。
知道是什么原因造成的吗?将来如何预防?从技术角度来看,它不会造成任何问题,但每次它发生时,我都会被要求查看 SVN 日志,以确保没有意外更改进入代码库。
编辑:我还注意到在查看 TortoiseSVN 日志屏幕时该文件显示为灰色,其中所有其他修改的文件以蓝色列出,添加的文件以紫色列出,删除的文件以红色列出,等等。这些与设置相关>常规 > 颜色,但我的是默认颜色,我没有任何灰色。 official documentation 没有列出任何关于在特殊情况下覆盖颜色的内容。
鉴于你已经排除了大部分的可能性,我能想到的只有一种情况,我相信这发生在我们身上:
svn property: svn:mime-type
如果文件上有此 属性,请说明它是不同于纯文本的其他类型。这使得 svn 无法简单地将差异存储在您的提交中,它可能会认为它已被更改并每次将其发送到 repo 以将其存储为每个修订版的单独二进制文件。然而,当使用比较工具时,它足够聪明,可以理解它实际上是一个向您显示差异屏幕的纯文本文件,但是如果没有实际更改,它会告诉您没有进一步混淆的更改。
请告诉我是否是这样,这很有趣,我很想知道为什么会这样。
尽管 运行 svn proplist MySpecialFile.pas
没有 return 任何东西,运行 svn propget svn:mergeinfo MySpecialFile.pas
给了我这个:
svn: warning: W200017: Property 'svn:mergeinfo' not found on MySpecialFile.pas
原来是文件上的svn:mergeinfo属性发生了变化。通过在 TortoiseSVN 日志中选择修订版,然后右键单击该文件并选择 "Show properties",我最终能够看到 属性。根据答案 here,我应该能够从所有文件和子文件夹中删除 属性。
在我的工作场所,我们使用 TortoiseSVN(当前版本为 1.9.6)进行广泛的分支和合并。每隔一段时间,日志中就会出现一个文件,作为合并提交的一部分进行了修改:
>svn log -r 86212 --verbose
------------------------------------------------------------------------
r86212 | user1 | 2018-05-15 16:18:09 -0400 (Tue, 15 May 2018) | 1 line
Changed paths:
M /path/to/file/MySpecialFile.pas
M /path/to/file/ANormalFile.pas
但在 MySpecialFile.pas 中(我发现)完全没有区别。文件属性没有改变,没有空格差异,我们只使用 Windows 操作系统,所以没有理由 Unix/Windows 行尾不匹配。事实上,如果我使用 "Diff with previous version" 选项,它会直接跳过有问题的修订版,使用 SVN diff 也有同样的效果:
>svn diff MySpecialFile.pas -r HEAD:PREV
Index: MySpecialFile.pas
===================================================================
--- MySpecialFile.pas (.../path/to/file/MySpecialFile.pas) (revision 86251)
+++ MySpecialFile.pas (.../path/to/file/MySpecialFile.pas) (revision 83226)
@@ -140,11 +140,11 @@
所以文件在 r86212 中被标记为已修改,但是当我告诉它从 HEAD 到 PREV 时,它比较 r86251 和 r83226。
知道是什么原因造成的吗?将来如何预防?从技术角度来看,它不会造成任何问题,但每次它发生时,我都会被要求查看 SVN 日志,以确保没有意外更改进入代码库。
编辑:我还注意到在查看 TortoiseSVN 日志屏幕时该文件显示为灰色,其中所有其他修改的文件以蓝色列出,添加的文件以紫色列出,删除的文件以红色列出,等等。这些与设置相关>常规 > 颜色,但我的是默认颜色,我没有任何灰色。 official documentation 没有列出任何关于在特殊情况下覆盖颜色的内容。
鉴于你已经排除了大部分的可能性,我能想到的只有一种情况,我相信这发生在我们身上:
svn property: svn:mime-type
如果文件上有此 属性,请说明它是不同于纯文本的其他类型。这使得 svn 无法简单地将差异存储在您的提交中,它可能会认为它已被更改并每次将其发送到 repo 以将其存储为每个修订版的单独二进制文件。然而,当使用比较工具时,它足够聪明,可以理解它实际上是一个向您显示差异屏幕的纯文本文件,但是如果没有实际更改,它会告诉您没有进一步混淆的更改。
请告诉我是否是这样,这很有趣,我很想知道为什么会这样。
尽管 运行 svn proplist MySpecialFile.pas
没有 return 任何东西,运行 svn propget svn:mergeinfo MySpecialFile.pas
给了我这个:
svn: warning: W200017: Property 'svn:mergeinfo' not found on MySpecialFile.pas
原来是文件上的svn:mergeinfo属性发生了变化。通过在 TortoiseSVN 日志中选择修订版,然后右键单击该文件并选择 "Show properties",我最终能够看到 属性。根据答案 here,我应该能够从所有文件和子文件夹中删除 属性。