【发布时间】:2013-10-10 16:14:57
【问题描述】:
我的问题是:什么可能导致 Mercurial 在文件未更改时将(通过“状态”或 TortoiseHgWorkbench)指示为“已修改”?
情况如下:我有一个 Linux 机器本地的存储库。我只使用 Linux 机器上的存储库。但是,我确实在 Windows 机器上拥有存储库(和工作文件)的精确副本(我通过闪存驱动器同步,使用 BeyondCompare)。据我所知,我从不在 Windows 机器上调用 mercurial,尽管它安装在那里。
我最近想在 Linux 机器上做一个提交,许多我没想到会出现的文件被列为“修改”。我做了一个视觉差异(使用 BeyondCompare),它表明工作目录副本与存储库中的父级“二进制相同”。 TortoiseHgWorkbench 显示文件“已修改”,差异窗口以绿色显示整个文件(好像存储库有一个空文件,我猜)。在有问题的文件上,文件系统上的文件日期是几个月前的,而我的最后一次提交(我提交所有更改的文件)是几周前。一些未更改的文件显示为“已修改”,但有些则没有。我以前从未见过这种行为,所以我有点困惑。
我在存储库上运行了“hg verify”,但没有发现任何有趣的东西。
我想这没什么大不了的,因为工作目录中的所有文件都完好无损,如果我要提交文件(即使它们没有改变),我不确定会有什么伤害。但我很想知道发生了什么。
提前感谢您提供的任何想法。
[编辑]
仍未找到根本原因(文件权限和访问日期未更改),但@barjak 的回复为我指明了我发现此问题的方向:Why does "hg status" show changed files when "hg diff -g" doesn't? (One parent)。我的情况与那里描述的相同( hg diff 和 hg diff --git 都只显示真正发生变化的文件,而 hg status 显示一些未更改的文件)。顺便说一句,我使用的是 Hg 2.6。
[编辑]
如果它对任何人有帮助,这是我回到正常存储库的方法:
在外壳中:
cd src
hg diff --git > ../junk
grep "\-\-git" ../junk
在 tortoiseHgWorkbench 中
uncheck all files marked "M"
check all files indicated in the grep results above (i.e., have real diffs)
commit
在外壳中:
hg revert --all
然后清理工作目录(revert --all 生成了一些失效的文件。还重置了一些文件日期(我是唯一使用这个存储库的人,文件日期对我很有用。是的,有一个 Hg 扩展来恢复文件日期,但我还没有安装它)。
这个过程让我重新排起了队。
【问题讨论】:
-
在 BC3 中,在 Session->Session Settings 下,Comparison 选项卡上是否设置为“Binary Comparison”或“Rules Based”。你比较的是什么类型的文件?
-
比较设置为“基于规则”。该文件是 C++ 源文件。 “二进制相同”的BC3结果确实是正确的。我现在要看看@barjak 建议的“权限”可能性。 (第一次检查看起来权限没有改变,但我会进一步挖掘......)
-
对我来说,如果我必须使用 Microsoft 的 Windows,就会发生这种情况。如果我用它来提交,那么如果我更新到这个版本,那么文件就会显示给我们改变了。 (也许 MS windows 正在将某些东西保存到 repo,这不是/或不能由 Unix 表示)。
标签: mercurial tortoisehg