22

ファイル X、Y、Z が変更されたことを git が内部的にどのように認識しているか説明してもらえますか? ファイルがまだ追加されていない、または変更されていることを認識する舞台裏のプロセスは何ですか? Subversion を使用すると、各フォルダーの下にディレクトリを作成することでこれらのことを追跡することが簡単.svnにわかりますが、git の場合、これの内部動作の説明が見つからないようです。非常に高速であるため、すべてのサブディレクトリをスキャンして変更を確認しているとは思えません。

では、好奇心というと、その内部の仕組みは何ですか?

4

6 に答える 6

17

ファイルのステータスを決定するメカニズムは非常に簡単です。どのファイルがステージングされたかを知るには、単純にHEADツリーとインデックスを比較します。インデックスにのみ表示されるアイテムは追加のためにステージングされ、インデックスにのみ表示されるHEADアイテムは削除され、異なるアイテムは変更がステージングされました。

同様に、インデックスを作業ディレクトリと比較することで、ステージングされていない変更を検出できます。

特にあなたの質問は、これがどのように高速になるかを尋ねます (結局のところ、ファイルの SHA1 ハッシュを計算するのは正確には高速ではありません)。ここで、インデックス (キャッシュとも呼ばれます)が再び登場します。インデックスには、ファイル サイズとファイル変更時間のフィールドもあります。したがって、単純stat(2)にディスク上のファイルをインデックスのファイル サイズとファイルの変更時間と比較して、ファイルをハッシュするかどうかを知ることができます。

于 2013-04-02T14:28:32.767 に答える
7

答えは、無料の本 Pro-Git のGit Internalsの章にあります。

この章では、内部で git がどのように機能するかについて説明します。

Leo が述べたように、git はファイルの SHA1 をチェックして、変更されているかどうかを確認します (Git Internals から取得)。

$ echo 'version 1' > test.txt
$ git hash-object -w test.txt
83baae61804e65cc73a7201a7252750c76066a30

次に、新しいコンテンツをファイルに書き込み、再度保存します。

$ echo 'version 2' > test.txt
$ git hash-object -w test.txt
1f7a7a472abf3dd9643fd615f6da379c4acb3e3a
于 2013-04-02T13:48:14.380 に答える
3

重複の可能性がある回答で十分でない場合は、このhttp://www.geekgumbo.com/2011/07/19/git-basics-how-git-saves-your-work/をご覧ください。

簡単に言うと、Git はSHA-1ファイルの内容の を使用して変更を追跡します。Git は、ブロブ、ツリー、コミット、タグの 4 つのオブジェクトを追跡します。

変更を追跡する方法についての質問に答えるには、そのリンクからの引用を次に示します。

ツリー オブジェクトは、Git がファイル名とディレクトリを追跡する方法です。ディレクトリごとにツリー オブジェクトがあります。ツリー オブジェクトは、そのディレクトリ内の SHA-1 BLOB、ファイル、および他のツリー、コミット時のサブディレクトリを指します。各ツリー オブジェクトは、ご想像のとおり、そのコンテンツの SHA-1 ハッシュに暗号化され、.git/objects に格納されます。ツリーの名前は SHA-1 ハッシュであるため、Git は名前を以前の名前と比較して、ファイルまたはディレクトリに変更があったかどうかをすばやく確認できます。かなり滑らか。

于 2013-04-02T13:48:59.990 に答える
2

この記事はとても役に立ちました。

https://codewords.recurse.com/issues/two/git-from-the-inside-out

Git はグラフ上に構築されます。ほぼすべての Git コマンドがこのグラフを操作します。Git を深く理解するには、ワークフローやコマンドではなく、このグラフのプロパティに注目してください。

抽出 - 最初のコミットではないコミットを行う

ユーザーは の内容をdata/number.txtに設定し2ます。これにより、作業コピーが更新されますが、インデックスとHEADコミットはそのまま残ります。

ユーザーがファイルを Git に追加します。これにより、2 を含む BLOB がオブジェクト ディレクトリに追加されます。data/number.txtこれは、新しい BLOBのインデックス エントリを指します。

于 2016-12-22T06:11:17.843 に答える
0

これは良いリファレンスです: A Visual Git Reference - marklodato.github.io/visual-git-guide/index-en.html 。インフォグラフィックの助けを借りてウォークスルーを提供するため、git をよりよく理解するのに役立ちます。

于 2021-08-06T20:06:07.580 に答える