[解決済み】gitのインデックスには何が含まれていますか?
質問
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を行います。
インデックスが次のコミットを準備する場所であるなら、なぜ " はしないのか。
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について説明する。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] リモート Git リポジトリの URI (URL) を変更するには?
-
[解決済み] ローカルの Git リポジトリが元々クローンされた URL を特定するにはどうすればよいですか。
-
[解決済み] ステージングされた変更を表示するにはどうしたらいいですか?
-
[解決済み] detached HEADとmaster/originの連携はどうすればいいですか?
-
[解決済み] Git で最新のコミットを新しいブランチに移動する
-
[解決済み】Gitバージョン管理でファイルの変更履歴を見る
-
[解決済み】Gitでコミットをチェリーピックするというのはどういう意味ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Git, fatal: リモートエンドが予期せずハングアップしました。
-
[解決済み】マージの競合が発生した git stash pop の取り消し
-
[解決済み] [email protected] へのいくつかの参考文献のプッシュに失敗しました。
-
[gitコミット失敗の解決] 現在のブランチの先端が後ろにあるため、更新が拒否されました。
-
Gitのプッシュでエラーが発生! [リモート拒否] master -> master (pre-receive hook declined) error: failed to push s...
-
[解決済み] 無効なVCSルートマッピング - 私のプロジェクトで3つのエラーが発生しました。
-
[解決済み] SourceTree error:1407742E:SSLルーチン:SSL23_GET_SERVER_HELLO:tlsv1警告プロトコルバージョン
-
[解決済み】gitで複数のステージを入力するとフェイタルエラーが発生する件
-
[解決済み] Git 'fatal: Unable to write new index file'.
-
[解決済み] Gitにおけるtree-ishの意味とは?