免责声明:我不是要求解决方案,解决方法或任何有关如何做事的建议,我只是对Mercurial的内部结构感到好奇。
我有一个mercurial存储库,其中包含一些子存储库(Git和Mercurial)。
hg st -S
不返回任何内容。)chown www-data:www-data -R *
现在,hg st -S
返回Git子目录的每个文件(Mercurial的文件仍然被认为是“干净的”)。 hg diff -S -g
的输出为空。我想知道为什么会这样?
到目前为止我发现了什么:
git status
,则该命令不显示待处理的修改,并且此特定仓库未被hg st
标记为已修改.hg
目录中文件的状态)hg up -C
)“解决了”问题.git
目录中更改权限,则仍然认为subrepo是干净的hg --debug up -C
的输出因标记为已修改的Git子参数而异:“clean”git subrepo:
subrepo/git1: git config --bool core.bare
subrepo/git1: git rev-parse HEAD
subrepo/git1: git diff-index --quiet HEAD
“已修改”git subrepo:
subrepo/git2: git config --bool core.bare
subrepo/git2: git rev-parse HEAD
subrepo/git2: git diff-index --quiet HEAD
subrepo subrepo/git2: other changed, get git://github.com/XXXX/YYYY.git:6f2442d36bb44724af116b97c85d2e344fc9a0a2:git
subrepo/git2: git cat-file -e 6f2442d36bb44724af116b97c85d2e344fc9a0a2
subrepo/git2: git config --bool core.bare
subrepo/git2: git rev-parse HEAD
subrepo/git2: git reset HEAD
subrepo/git2: git reset --hard HEAD
因此,据我所知,元数据中的权限更改不是原因,所以是什么?我可能只是错过了一些非常简单的东西。
仅供参考,我使用1.9.3版本,我不记得我是否在之前的版本中使用了相同的版本。
在有人提议我停止做这样的许可改变之前,我已经做了,我不再遇到这个问题了,只是因为我喜欢理解为什么会发生什么事情;)
运行git diff-index HEAD
会提供以下输出:
[...]
:100644 100644 fef0f187a5eabc82dc1a90661bd86d317114e40e 0000000000000000000000000000000000000000 M my/file/insubrepo.php
[...]
如果我运行git diff-index -p HEAD
,则差异为空。我仍然不知道为什么git会考虑修改这些文件。
答案 0 :(得分:2)
可能存在的问题(可能的解决方案):
更改文件模式将相对于Git索引更改文件统计信息(如上所述here)。
要解决问题,请尝试:
git update-index --refresh
这应该可以修复文件统计信息。
关于Mercurial内部的背景信息:
为了确定Git subrepo是否脏(即有本地修改),Mercurial运行git diff-index --quiet HEAD
。
请参阅dirty
的subrepos.py::gitsubrepo
方法。
我希望在您更改权限后,git diff-index
会显示您手动执行git status
的更改。
git diff-index
的输出格式如下(有关详细信息,请参阅man page):
:<mode before> <mode after> <status> <file>
根据您在上面列出的输出,这表示:“文件my/file/insubrepo.php
已在工作副本中修改,但文件模式相同”。