2

免責事項: 私は解決策、回避策、または物事を行う方法についてのアドバイスを求めているわけではありません。単に Mercurial の内部構造に興味があるだけです。

私はいくつかのサブリポジトリ (Git および Mercurial) を含む mercurial リポジトリを持っています。

  1. 私のリポジトリとすべてのサブリポジトリはクリーンな状態です (つまり、hg st -S何も返されません)。
  2. ルートでいくつかの積極的なアクセス許可の変更を行います。chown www-data:www-data -R *

これhg st -Sで、Git サブリポジトリのすべてのファイル (Mercurial のファイルは引き続き「クリーン」と見なされます) が変更されたものとして返されます。の出力hg diff -S -gは空です。なぜこれが起こったのだろうか?

これまでに発見したこと:

  1. git statusサブレポの1つで実行すると、コマンドは保留中の変更を表示せず、この特定のレポは変更済みとしてマークされなくhg stなりました
  2. 権限の変更をサブレポに制限すると、このサブレポのみが変更済みとしてマークされます (つまり、「問題」は.hgディレクトリ内のファイルの状態にリンクされません) 。
  3. クリーン アップデート ( hg up -C) を実行すると、問題が「解決」します
  4. ディレクトリでのみ権限を変更して.gitも、サブレポはまだクリーンと見なされます
  5. の出力は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がこれらのファイルが変更されたと見なすのか、まだわかりません。

4

1 に答える 1

2

考えられる問題 (解決策の可能性あり):

ファイル モードを変更すると、Git インデックスに関するファイルの統計情報が変更されます (ここで説明されているように)。

問題を解決するには、次を試してください。

  1. Git スブレポに移動する
  2. 走るgit update-index --refresh

これにより、ファイルの統計が汚れているのを修正する必要があります。


Mercurial 内部の背景情報:

Git サブリポジトリがダーティ (つまり、ローカルの変更がある) かどうかを判断するために、Mercurial は を実行しgit diff-index --quiet HEADます。

dirtyの方法を参照してくださいsubrepos.py::gitsubrepo

git diff-indexアクセス許可を変更した後、手動で実行した場合にない変更が表示されることを期待していますgit status

の出力は次のgit diff-indexようにフォーマットされます (詳細については、 man ページを参照してください)。

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

上記の出力を考えると、「ファイルmy/file/insubrepo.phpは作業コピーで変更されていますが、ファイルモードは同じです」ということです。

于 2011-11-17T20:24:39.947 に答える