gitはどのようにしてファイルの変更を高速に検出しますか?gitはファイルが変更されたことをどのように検出しますか?
レポのすべてのファイルをハッシュし、SHA1を比較しますか?これには多くの時間がかかりますね。
またはatime
,ctime
またはmtime
を比較しますか?
gitはどのようにしてファイルの変更を高速に検出しますか?gitはファイルが変更されたことをどのように検出しますか?
レポのすべてのファイルをハッシュし、SHA1を比較しますか?これには多くの時間がかかりますね。
またはatime
,ctime
またはmtime
を比較しますか?
これは、stat()
の組み合わせを使用して、変更された可能性があるように見えて、実際にはそれが実際のエンジンと異なることを確認することになると思われます。
diffエンジンhereのコードでは、いくつかのアイデアを得ることができます。私はコードベースを追跡して、statusコマンドが実際にこのコードを呼び出すことを確かめました(多くのもののように見えます)。実際には、これはGitがWindows上でかなり悪い動作をすることを知っているときには、これらのPOSIXタイプの呼び出しを実行するのにエミュレーションレイヤーを使用しています。そのプラットフォームでgit status
を実行するのが一桁遅いです。
とにかく、すべてのコードを上から下に読むのが不足しています(時間があれば後で表示されるかもしれません)。私は今あなたを連れて行くことができます。コードベースで
注:別の可能性のある高速化は、明らかに意味をなさないinline
機能の賢明な使用に由来します。ヘッダーでこれを明確に見ることができます。
[編集:stat()
の説明についてはhereを参照してください]
プラットフォームによっては、Gitがステータスを把握するために使用するシステムコールを調べることができるはずです。 Linuxでは、SunOSではtruss git status
、Mac OS Xではデベロッパーツールと一緒に出荷されるDTraceベースのツールと見なしてください。
Gitは、ワークスタイルが一致するlstat()値だけでは納得できません。インデックスには、ファイルの内容に戻ってくるのは非常に高価です。
Documentation/technical/racy-git.txtは、どのstatフィールドが使用されているか、およびmtime精度が低いために競合状態がどのように回避されるかを記述します。 This article has some more detail。
統計値は耐タンパではありません。futimens(3)を参照してください。 Gitはファイルの変更を見逃してしまうかもしれません。コンテンツハッシュの完全性を損なうことはありません。
しかし、すべてのコミットがファイルの内容に転倒しますか?それともコミット時であっても推測していますか? – Pacerier
プラットフォームによって異なる場合があります。私は特にGit/Windowsがそれをやる方法に興味があります。 – Pacerier