1. ホーム
  2. ギット

[解決済み】gitのインデックスには何が含まれていますか?

2022-04-10 09:34:57

質問

Gitのインデックスには何が含まれていますか?インデックスの内容を見るには、どのようなコマンドを使えばいいのでしょうか?


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

Gitの用語でいうところの 配管 コマンドを使えば、インデックスの中身を一覧することができますか?

どのように解決するのですか?

Gitブックには、以下の記事があります。 インデックスに含まれるもの :

インデックスはバイナリファイル(一般的には .git/index ) パス名のソートされたリストが含まれており、それぞれにパーミッションとブロブオブジェクトのSHA1が設定されています。 git ls-files はインデックスの中身を表示することができます。

$ git ls-files --stage
100644 63c918c667fa005ff12ad89437f2fdc80926e21c 0   .gitignore
100644 5529b198e8d14decbe4ad99db3f7fb632de0439d 0   .mailmap

レイシーギット問題 は、その構造についてもう少し詳しく説明しています。

インデックスはgitで最も重要なデータ構造の1つです。

これは、パスとそのオブジェクト名のリストを記録することによって、仮想的な作業木の状態を表し、次にコミットされる木のオブジェクトを書き出すためのステージング・エリアとして機能します。

この状態は、必ずしも作業ツリー内のファイルと一致する必要はなく、また一致しないことも多いという意味で、quot;virtual"である。


2021年11月:"もご覧ください。 Gitのスパース・インデックスでmonorepoを小さく感じるようにする からの デリック・ストーリー (マイクロソフト/GitHub)

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 は現在、キャッシュされたツリーと resolve undo 拡張をサポートしています。
  • 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) :

参照 コミット 77ff112 , コミット 3255089 , コミットabb4bb8 , コミット c780b9c , コミット 3b1d9e0 , コミット 371ed0d (2018年10月10日)による ベン・ピート( benpeart ) .

参照 コミット 252d079 (2018年9月26日)によるものです。 Nguyễn Thái Ngọc Duy ( pclouds ) .

(によって統合されました。 ジュニオ・C・ハマノ--。 gitster -- コミットe27bfaa , 2018年10月19日)

<ブロッククオート

ieot: Index Entry Offset Table (IEOT) 拡張を追加しました。

このパッチは、インデックスをロードする際のCPUコストに対応するために インデックスにデータを追加することで、効率的にマルチ は、キャッシュエントリのロードと変換をスレッド化する。

これは、(オプションの)インデックス拡張を追加することによって達成されます。 インデックスファイル内のキャッシュエントリーのブロックへのオフセットのテーブル。

V4 インデックスでこれを実現するために、キャッシュエントリを書き込む際に、現在のエントリを以前のエントリのパス名が全く異なるかのようにエンコードしてプレフィックス圧縮を定期的に"リセット" して保存しています。 IEOTのそのエントリのオフセット。

基本的に、V4インデックスでは、プレフィックス圧縮されたエントリーのブロックにオフセットを生成する。

を使用すると index.threadsの新しい設定 インデックスの読み込みが速くなりました。


その結果、( IEOTを使用した場合 ), コミット7bd9631 をクリーンアップします。 read-cache.c load_cache_entries_threaded() 関数をGit 2.23 (2019年第3四半期) に対応させました。

参照 コミット8373037 , コミットd713e88 , コミットd92349d , コミット 113c29a , コミット c95fc72 , コミット 7a2a721 , コミット c016579 , コミットbe27fb7 , コミット 13a1781 , コミット 7bd9631 , コミット 3c1dce8 , コミット cf7a901 , コミットd64db5b , コミット 76a7bc0 (2019年05月09日)による ジェフ・キング ( peff ) .

(によって統合されました。 ジュニオ・C・ハマノ--。 gitster -- コミット c0e78f7 , 2019年6月13日)

<ブロッククオート

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の作業に調整されます。

参照 コミット 8afa50a , コミット 0756e61 , コミット123712b , コミット 5b6422a (2020年8月15日)によるものです。 マーティン・オーグレン( none ) .

(によって統合されました。 ジュニオ・C・ハマノ--。 gitster -- コミット 74a395c , 2020年8月19日)

<ブロッククオート

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

<上 署名者:Martin Ågren

<ブロッククオート

SHA-1リポジトリではSHA-1を使用し、SHA-256リポジトリではSHA-256を使用することを文書化し、他のすべての"SHA-1"の使用をより中立なものに置き換えてください。

160bit" のハッシュ値への言及は避けてください。

technical/index-format に含まれるようになりました。 マンページ :

2進数はすべてネットワークバイトオーダーです。

従来のSHA-1を使用するリポジトリでは、チェックサムやオブジェクトID (オブジェクト名)は、すべてSHA-1によって計算されます。

同様に、SHA-256リポジトリでは、これらの値はSHA-256を使用して計算されます。

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