2009-11-22 4 views
49

gitはどのようにしてファイルの変更を高速に検出しますか?gitはファイルが変更されたことをどのように検出しますか?

レポのすべてのファイルをハッシュし、SHA1を比較しますか?これには多くの時間がかかりますね。

またはatime,ctimeまたはmtimeを比較しますか?

+0

プラットフォームによって異なる場合があります。私は特にGit/Windowsがそれをやる方法に興味があります。 – Pacerier

答えて

3

これは、stat()の組み合わせを使用して、変更された可能性があるように見えて、実際にはそれが実際のエンジンと異なることを確認することになると思われます。

diffエンジンhereのコードでは、いくつかのアイデアを得ることができます。私はコードベースを追跡して、statusコマンドが実際にこのコードを呼び出すことを確かめました(多くのもののように見えます)。実際には、これはGitがWindows上でかなり悪い動作をすることを知っているときには、これらのPOSIXタイプの呼び出しを実行するのにエミュレーションレイヤーを使用しています。そのプラットフォームでgit statusを実行するのが一桁遅いです。

とにかく、すべてのコードを上から下に読むのが不足しています(時間があれば後で表示されるかもしれません)。私は今あなたを連れて行くことができます。コードベースで

注:別の可能性のある高速化は、明らかに意味をなさないinline機能の賢明な使用に由来します。ヘッダーでこれを明確に見ることができます。

[編集:stat()の説明についてはhereを参照してください]

+0

'stat()'は何ですか? – hasen

+0

@hansen j:stat()のマニュアルページへの参照で更新されました。 – jkp

6

あり、「gitの状態」のようなレポートのための初期のmtimeチェックがだが、最終的に計算されコミットするとき、mtimeのは重要ではありません...それはですSHA1が重要です。

+1

@Randal:これは本当だとは思わない、それはいつもdiffをする:http://gist.github.com/240775。 'git status'のためにmtimeだけが使われていたなら、あなたはペーストに変更を見ました。 – jkp

+2

@jkp私自身のstrace-ingは、変更されていないworktreeファイルには 'lstat'しか実行していないことを示しています。 – Tobu

2

プラットフォームによっては、Gitがステータスを把握するために使用するシステムコールを調べることができるはずです。 Linuxでは、SunOSではtruss git status、Mac OS Xではデベロッパーツールと一緒に出荷されるDTraceベースのツールと見なしてください。

28

Gitは、ワークスタイルが一致するlstat()値だけでは納得できません。インデックスには、ファイルの内容に戻ってくるのは非常に高価です。

Documentation/technical/racy-git.txtは、どのstatフィールドが使用されているか、およびmtime精度が低いために競合状態がどのように回避されるかを記述します。 This article has some more detail

統計値は耐タンパではありません。futimens(3)を参照してください。 Gitはファイルの変更を見逃してしまうかもしれません。コンテンツハッシュの完全性を損なうことはありません。

+1

しかし、すべてのコミットがファイルの内容に転倒しますか?それともコミット時であっても推測していますか? – Pacerier

関連する問題