Mercurial内部:积极的权限更改后的Git子存储库状态

时间:2011-11-17 15:59:28

标签: git mercurial internals mercurial-subrepos

免责声明:我不是要求解决方案,解决方法或任何有关如何做事的建议,我只是对Mercurial的内部结构感到好奇。

我有一个mercurial存储库,其中包含一些子存储库(Git和Mercurial)。

  1. 我的资源库和所有子资源处于干净状态(即:hg st -S不返回任何内容。)
  2. 我在根目录下进行了一些积极的权限更改:chown www-data:www-data -R *
  3. 现在,hg st -S返回Git子目录的每个文件(Mercurial的文件仍然被认为是“干净的”)。 hg diff -S -g的输出为空。我想知道为什么会这样?

    到目前为止我发现了什么:

    1. 如果我在其中一个subrepo中执行了git status,则该命令不显示待处理的修改,并且此特定仓库未被hg st标记为已修改
    2. 如果我将权限更改限制为subrepo,则只将此子标记标记为已修改(即“问题”未链接到.hg目录中文件的状态)
    3. 执行干净更新(hg up -C)“解决了”问题
    4. 如果我仅在.git目录中更改权限,则仍然认为subrepo是干净的
    5. hg --debug up -C的输出因标记为已修改的Git子参数而异:
    6. “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会考虑修改这些文件。

1 个答案:

答案 0 :(得分:2)

可能存在的问题(可能的解决方案):

更改文件模式将相对于Git索引更改文件统计信息(如上所述here)。

要解决问题,请尝试:

  1. 导航到你的Git sburepo
  2. 运行git update-index --refresh
  3. 这应该可以修复文件统计信息。


    关于Mercurial内部的背景信息:

    为了确定Git subrepo是否脏(即有本地修改),Mercurial运行git diff-index --quiet HEAD

    请参阅dirtysubrepos.py::gitsubrepo方法。

    我希望在您更改权限后,git diff-index会显示您手动执行git status的更改。

    git diff-index的输出格式如下(有关详细信息,请参阅man page):

    :<mode before> <mode after> <status> <file>
    

    根据您在上面列出的输出,这表示:“文件my/file/insubrepo.php已在工作副本中修改,但文件模式相同”。