209

Git インデックスには正確には何が含まれていますか? また、インデックスの内容を表示するにはどのコマンドを使用できますか?


ご回答ありがとうございます。インデックスがステージング領域として機能し、コミットされたものが作業ツリーではなくインデックスにあることを私は知っています。インデックスオブジェクトが何で構成されているかについて興味があります。ファイル名/ディレクトリ名のリスト、SHA-1ペア、一種の仮想ツリーではないでしょうか?

Git 用語で、インデックスの内容を一覧表示するために使用できる配管コマンドはありますか?

4

7 に答える 7

181

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」も参照してください。

https://github.blog/wp-content/uploads/2021/11/Fig-1-working-directory-index-commit-history.png

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 3255089commit abb4bb8commit c780b9ccommit 3b1d9e0commit 371ed0d (2018 年 10 月 10 日) by Ben Peart ( benpeart)を参照してください。Nguyễn Thái Ngọc Duy ( )によるコミット 252d079 (2018 年 9 月 26 日)
を参照してください。( 2018 年 10 月 19 日コミット e27bfaaJunio 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 日コミット c0e78f7Junio 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 8afa50acommit 0756e61commit 123712bcommit 5b6422a (2020 年 8 月 15 日) by Martin Ågren ( none)を参照してください。
( 2020 年 8 月 19 日、コミット 74a395cJunio C Hamanoによってマージされました)gitster

index-format.txt: ドキュメント SHA-256 インデックス形式

署名者: Martin Ågren

SHA-1 リポジトリでは SHA-1 を使用し、SHA-256 リポジトリでは SHA-256 を使用することを文書化してから、「SHA-1」の他のすべての使用をより中立的なものに置き換えます。
「160 ビット」のハッシュ値を参照することは避けてください。

technical/index-formatmanページに含まれるようになりました:

すべての 2 進数はネットワーク バイト順です。
従来の SHA-1 を使用するリポジトリでは、以下で説明するチェックサムとオブジェクト ID (オブジェクト名) はすべて SHA-1 を使用して計算されます。
同様に、SHA-256 リポジトリでは、これらの値は SHA-256 を使用して計算されます。

特に断りのない限り、ここではバージョン 2 について説明します。

于 2010-11-03T12:23:19.787 に答える
12

Git インデックスは、作業ディレクトリとリポジトリの間のステージング領域です。インデックスを使用して、一緒にコミットする一連の変更を構築できます。コミットを作成すると、作業ディレクトリにあるものではなく、現在このインデックスにあるものがコミットされます。

インデックスの内容を確認するには、次のコマンドを発行します。

git status

git status を実行すると、(現在インデックスにある) ステージングされているファイル、変更されているがまだステージングされていないファイル、および完全に追跡されていないファイルを確認できます。

これを読むことができます。Google で検索すると、多くのリンクが表示されますが、これで十分です。

于 2010-11-03T07:25:48.647 に答える