免責事項: 私は解決策、回避策、または物事を行う方法についてのアドバイスを求めているわけではありません。単に Mercurial の内部構造に興味があるだけです。
私はいくつかのサブリポジトリ (Git および Mercurial) を含む mercurial リポジトリを持っています。
- 私のリポジトリとすべてのサブリポジトリはクリーンな状態です (つまり、
hg st -S
何も返されません)。 - ルートでいくつかの積極的なアクセス許可の変更を行います。
chown www-data:www-data -R *
これhg st -S
で、Git サブリポジトリのすべてのファイル (Mercurial のファイルは引き続き「クリーン」と見なされます) が変更されたものとして返されます。の出力hg diff -S -g
は空です。なぜこれが起こったのだろうか?
これまでに発見したこと:
git status
サブレポの1つで実行すると、コマンドは保留中の変更を表示せず、この特定のレポは変更済みとしてマークされなくhg st
なりました- 権限の変更をサブレポに制限すると、このサブレポのみが変更済みとしてマークされます (つまり、「問題」は
.hg
ディレクトリ内のファイルの状態にリンクされません) 。 - クリーン アップデート (
hg up -C
) を実行すると、問題が「解決」します - ディレクトリでのみ権限を変更して
.git
も、サブレポはまだクリーンと見なされます - の出力は
hg --debug up -C
、変更済みとしてマークされた Git サブレポとは異なります。
「クリーン」gitサブレポ:
subrepo/git1: git config --bool core.bare
subrepo/git1: git rev-parse HEAD
subrepo/git1: git diff-index --quiet HEAD
「変更された」git サブレポ:
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がこれらのファイルが変更されたと見なすのか、まだわかりません。