Git book には、インデックスに含まれるものに関する記事が含まれています。
インデックスは、.git/index
パス名の並べ替えられたリストを含むバイナリ ファイル (通常は に保持されます) であり、それぞれに権限と BLOB オブジェクトの SHA1 が含まれています。git ls-files
インデックスの内容を表示できます。
$ git ls-files --stage
100644 63c918c667fa005ff12ad89437f2fdc80926e21c 0 .gitignore
100644 5529b198e8d14decbe4ad99db3f7fb632de0439d 0 .mailmap
Racy git problemは、その構造に関する詳細を提供します。
インデックスは、git で最も重要なデータ構造の 1 つです。
これは、パスとそのオブジェクト名のリストを記録することによって仮想作業ツリーの状態を表し、コミットされる次のツリー オブジェクトを書き出すためのステージング領域として機能します。
状態は、必ずしも作業ツリー内のファイルと一致する必要はなく、多くの場合、一致しないという意味で「仮想」です。
2021 年 11 月: Derrick Stolee (Microsoft/GitHub)の「 Make your monorepo feel small with Git's sparse index」も参照してください。
Git インデックスは、Git の重要なデータ構造です。ファイルシステムにあるファイルとコミット履歴の間の「ステージング領域」として機能します。
- を実行する
git add
と、作業ディレクトリのファイルがハッシュされ、オブジェクトとしてインデックスに格納されるため、「ステージングされた変更」になります。
- を実行する
git commit
と、インデックスに保存されているステージングされた変更を使用して、新しいコミットが作成されます。
- を実行する
git checkout
と、Git はコミットからデータを取得し、それを作業ディレクトリとインデックスに書き込みます。
インデックスは、ステージングされた変更を保存するだけでなく、作業ディレクトリに関するファイル システム情報も保存します。
これにより、Git は変更されたファイルをより迅速に報告できます。
詳細については、参照してください。" git/git/Documentation/technical/index-format.txt ":
Git インデックス ファイルの形式は次のとおりです。
すべての 2 進数はネットワーク バイト順です。特に断りのない限り、ここでは
バージョン 2について説明します。
- 以下で構成される 12 バイトのヘッダー。
- 4 バイトの署名:
署名は { ' D
', ' I
', ' R
', ' C
' } (" " の略dircache
)
- 4 バイトのバージョン番号:
現在サポートされているバージョンは 2、3、および 4 です。
- インデックス エントリの 32 ビット数。
- 並べ替えられたインデックス エントリの数。
- 拡張機能:
拡張機能は署名によって識別されます。
オプションの拡張機能は、Git が理解できない場合は無視できます。
Git は現在、キャッシュされたツリーをサポートし、元に戻す拡張機能を解決します。
- 4 バイトの拡張署名。最初のバイトが '
A
'..' Z
' の場合、拡張子はオプションであり、無視できます。
- 拡張の 32 ビット サイズ
- 拡張データ
- このチェックサムの前に、インデックス ファイルのコンテンツに対する 160 ビット SHA-1。
mljrg コメント:
インデックスが次のコミットが準備される場所である場合、コミットgit ls-files -s
後に " " が何も返さないのはなぜですか?
インデックスは追跡されているものを表し、コミットの直後であるため、追跡されているものは最後のコミットと同じです (何git diff --cached
も返されません)。
そのgit ls-files -s
ため、追跡されたすべてのファイルが一覧表示されます (出力のオブジェクト名、モード ビット、およびステージ番号)。
その (追跡される要素の) リストは、コミットの内容で初期化されます。
ブランチを切り替えると、インデックスの内容は、切り替えたばかりのブランチが参照するコミットにリセットされます。
Git 2.20 (2018 年第 4 四半期) は、インデックス エントリ オフセット テーブル (IEOT)を追加します。
commit 77ff112、commit 3255089、commit abb4bb8、commit c780b9c、commit 3b1d9e0、commit 371ed0d (2018 年 10 月 10 日) by Ben Peart ( benpeart
)を参照してください。Nguyễn Thái Ngọc Duy ( )によるコミット 252d079 (2018 年 9 月 26 日)
を参照してください。( 2018 年 10 月 19 日にコミット e27bfaaでJunio C Hamanoによってマージされました)pclouds
gitster
ieot: インデックス エントリ オフセット テーブル (IEOT) 拡張機能を追加
このパッチは、キャッシュ エントリの読み込みと変換を効率的にマルチスレッド化できるようにする追加データをインデックスに追加することで、インデックスを読み込む CPU コストに対処できるようにします。
これは、インデックス ファイル内のキャッシュ エントリのブロックへのオフセットのテーブルである (オプションの) インデックス拡張を追加することによって実現されます。
V4 インデックスでこれを機能させるには、キャッシュ エントリを書き込むときに、前のエントリのパス名が完全に異なるかのように現在のエントリをエンコードすることで、プレフィックス圧縮を定期的に「リセット」し、そのエントリのオフセットを IEOT に保存します。 .
基本的に、V4 インデックスでは、プレフィックス圧縮されたエントリのブロックにオフセットを生成します。
新しい index.threads 構成設定により、インデックスの読み込みが高速になりました。
( IEOT を使用した結果)、コミット 7bd9631read-cache.c load_cache_entries_threaded()
は Git 2.23 (Q3 2019)の関数をクリーンアップします。
コミット8373037、D713E88のコミット、コミットD92349D、コミット113C29A、 C95FC72のコミット、 7A2A721のコミット、C016579のコミット、コミットBE27FB7、コミット13A1781、コミット7BD9631、CF7A901をコミットするCF7A901、コミットメント8のコミット( )。( 2019 年 6 月 13 日、コミット c0e78f7でJunio C Hamanoによってマージされました)peff
gitster
read-cache: スレッド化されたロードから未使用のパラメータを削除
load_cache_entries_threaded()
関数は、使用src_offset
しないパラメーターを受け取ります。これは、 77ff112 ( read-cache
: ワーカー スレッドにキャッシュ エントリをロードする、2018-10-10、Git v2.20.0-rc0) の開始以来存在しています。
メーリング リストを調べてみると、そのパラメーターはシリーズの初期のイテレーションの一部でしたが、コードが IEOT 拡張機能の使用に切り替わったときに不要になりました。
Git 2.29 (2020 年第 4 四半期) では、形式の説明が最近の SHA-256 作業に合わせて調整されています。
commit 8afa50a、commit 0756e61、commit 123712b、commit 5b6422a (2020 年 8 月 15 日) by Martin Ågren ( none
)を参照してください。
( 2020 年 8 月 19 日、コミット 74a395cでJunio C Hamanoによってマージされました)gitster
署名者: Martin Ågren
SHA-1 リポジトリでは SHA-1 を使用し、SHA-256 リポジトリでは SHA-256 を使用することを文書化してから、「SHA-1」の他のすべての使用をより中立的なものに置き換えます。
「160 ビット」のハッシュ値を参照することは避けてください。
technical/index-format
manページに含まれるようになりました:
すべての 2 進数はネットワーク バイト順です。
従来の SHA-1 を使用するリポジトリでは、以下で説明するチェックサムとオブジェクト ID (オブジェクト名) はすべて SHA-1 を使用して計算されます。
同様に、SHA-256 リポジトリでは、これらの値は SHA-256 を使用して計算されます。
特に断りのない限り、ここではバージョン 2 について説明します。