12

コミットする前にファイルからすべてのコメントを削除する.gitattributesクリーン フィルターがあります。

$ cat .git/config
[filter "cleancomments"]
    clean = "grep -v '^#'"

$ cat .gitattributes
*   filter=cleancomments

そして、次のコンテンツを含む「テスト」ファイルがあります(リポジトリにコミットされています):

This is a file with random content

ここで、「test」に変更を加えてコメントを追加します。

This is a file with random content
# and some comments
# like this

git status今私に言います:

modified:   test

しかしgit diff空です(そうあるべきです)。

git status がフィルターを使用してファイルが変更されたかどうかを判断しない理由は完全には明らかではありませんが、これが実装方法であると思います。

私にとって本当に不思議なのは、次のとおりです。

私がこれを行う場合:

git add test

その後、突然、ファイル「test」は変更済みとしてマークされなくなり、git インデックスに表示されなくなります。どうしてこれなの?

4

1 に答える 1

7

git addファイルをインデックスに追加しますが、最初に必要なフィルターを実行します。

インデックスには、ファイルのディスク上の名前と「真の名前」(「ブロブ」としてのその git ハッシュ)、ディレクトリstat値、git ハッシュ値のペア (元の値とフィルター処理された値)、および必要に応じてその他のビットとボブが含まれます。編集すると、インデックス データから、ファイルがインデックス内で現在「最新」であり、 addBLOBのハッシュがコミット ハッシュgit statusと一致するため、リポジトリ内のインデックス自体が最新であることがわかります。HEAD

ただし、ファイルをさらに変更すると、いくつかの重要なstatデータが変更され、git はインデックスがgit status古くなっていると判断し、もう一度git add-ed する必要があると判断します。2

ここでの一般的な考え方はgit status、何も (インデックスも) 書き込まないということです。work-dir/cleaned-entry のペアリングを更新するといいかもしれませんgit update-index --refreshが、そうではないようです。


1より正確にはgit add、ハッシュを計算し、したがってリポジトリ内の「真の名前」を計算し、オブジェクトがまだ存在しない場合にのみ、オブジェクトをリポジトリに追加します。ハッシュ値が既知になり、必要に応じてインデックスに格納できます。ハッシュ値は、フィルタリングとハッシュを実行するまで不明です。つまり、ハッシュ値をgit status知りません。

2--assume-unchangedおよび/またはのようなものを使用すると、ここにさらに微妙な点がありますcore.ignorestat

于 2013-11-06T10:05:50.437 に答える