考慮事項:
$ git --version git version 2.20.1 (Apple Git-117) $ git diff-index --quiet HEAD ; echo $? 1 $ git status > /dev/null $ git diff-index --quiet HEAD ; echo $? 0
これは大文字と小文字を区別しないファイルシステムを備えたmacos上にあります。 (これが関係するかどうかはわかりません。)これが発生するホストには、同じディレクトリがマウントされたdebianを実行しているdockerイメージがあり、dockerイメージでは、逆の動作が発生します。
$ git diff-index --quiet HEAD ; echo $? 0 # At this point, `git status` was invoked outside the docker image $ git --version git version 2.20.1 $ git diff-index --quiet HEAD ; echo $? 1
明確にするために、ここで実行されるコマンドのシーケンスは、Dockerイメージ上のgit diff-index
(0を返します)、(1を返します)、ホストではgit status
、ホストではgit diff-index
(0を返します) 、git diff-index
をDockerイメージで(1を返します)。
基本的に、1つの環境でgit-status
を実行すると、 git diff-index
は、その環境では成功(0を返す)し、他の環境では失敗します。何が起こっているのかについて何か考えはありますか?これは大したことではなく、私はそのケースが疑われますファイルシステムの鈍感さが原因ですが、しっかりとした説明が欲しいです。
回答
私はと原因は同じだと思います。これは、Dockerや大文字と小文字を区別しないファイルシステムを含む必要はありませんが、問題を悪化させる可能性があります。
Gitは、ファイルのコンテンツに関する情報のキャッシュを維持します。通常、これは透過的で高レベルです。 git status
やgit diff
などのコマンドは必要に応じてキャッシュを更新します。
git diff-index
とgit diff-files
は、すばやく、しかしおおよその結果を返すように設計されています。キャッシュは更新されません。比較しているものが同一であることが確実な場合は0を返しますが、1を返す場合は、「同一であることに気づいていません」という意味です。キャッシュエントリが古くなっている場合は、物事は同じである可能性がありますが、git diff-xxx
はわかりません。
キャッシュがどのように機能するか正確にはわかりません。最初の実験では、git diff-index
を最初に呼び出したときに、キャッシュエントリが古くなっていることに気付いたため、「わからない」の場合は1が返されました。次にgit status
がキャッシュを更新し、git diff-index
への2回目の呼び出しで有効なキャッシュエントリが見つかり、ファイルが同一であると結論付けることができました。2番目の実験では、 Dockerコンテナの外部のgit status
は、コンテナ内のgit diff-index
が古いと見なされるキャッシュエントリを作成したようであるため、
は「わからない」に対して1を返しました。
私の解決策は、低レベルのコマンドを忘れてgit diff --quiet
。