日本語 ▾ トピック ▾ 最新バージョン ▾ git-update-index は 2.45.3 で最終更新

名前

git-update-index - 作業ツリーのファイル内容をインデックスに登録する

概要

git update-index
	     [--add] [--remove | --force-remove] [--replace]
	     [--refresh] [-q] [--unmerged] [--ignore-missing]
	     [(--cacheinfo <mode>,<object>,<file>)…​]
	     [--chmod=(+|-)x]
	     [--[no-]assume-unchanged]
	     [--[no-]skip-worktree]
	     [--[no-]ignore-skip-worktree-entries]
	     [--[no-]fsmonitor-valid]
	     [--ignore-submodules]
	     [--[no-]split-index]
	     [--[no-|test-|force-]untracked-cache]
	     [--[no-]fsmonitor]
	     [--really-refresh] [--unresolve] [--again | -g]
	     [--info-only] [--index-info]
	     [-z] [--stdin] [--index-version <n>]
	     [--show-index-version]
	     [--verbose]
	     [--] [<file>…​]

説明

インデックスを変更します。指定された各ファイルはインデックスに更新され、未マージまたは更新が必要な状態はクリアされます。

インデックスの最も一般的な操作をよりユーザーフレンドリーな方法で行うには、git-add[1] も参照してください。

git update-index が指定されたファイルを処理する方法は、様々なオプションで変更できます

オプション

--add

指定されたファイルがまだインデックスにない場合は追加されます。デフォルトの動作では、新規ファイルは無視されます。

--remove

指定されたファイルがインデックスにあるが欠落している場合は削除されます。デフォルトの動作では、削除されたファイルは無視されます。

--refresh

現在のインデックスを調べ、stat() 情報を確認してマージまたは更新が必要かどうかをチェックします。

-q

静かに実行します。--refresh がインデックスの更新が必要であると判断した場合、デフォルトの動作ではエラーを報告します。このオプションを使用すると、git update-index はとにかく続行します。

--ignore-submodules

サブモジュールの更新を試みません。このオプションは --refresh の前に渡された場合にのみ有効です。

--unmerged

--refresh がインデックス内に未マージの変更を見つけた場合、デフォルトの動作ではエラーを報告します。このオプションを使用すると、git update-index はとにかく続行します。

--ignore-missing

--refresh 中に欠落しているファイルを無視します

--cacheinfo <mode>,<object>,<path>
--cacheinfo <mode> <object> <path>

指定された情報を直接インデックスに挿入します。後方互換性のために、これら3つの引数を3つの別々のパラメータとして与えることもできますが、新規ユーザーは単一パラメータ形式を使用することをお勧めします。

--index-info

標準入力からインデックス情報を読み取ります。

--chmod=(+|-)x

更新されたファイルの実行パーミッションを設定します。

--[no-]assume-unchanged

このフラグが指定されている場合、パスに対して記録されているオブジェクト名は更新されません。代わりに、このオプションはパスの「assume unchanged」ビットを設定/解除します。「assume unchanged」ビットがオンの場合、ユーザーはファイルを変更しないことを約束し、Git は作業ツリーのファイルがインデックスに記録されているものと一致すると仮定します。作業ツリーのファイルを変更したい場合は、そのビットを解除して Git に伝える必要があります。これは、非常に遅い lstat(2) システムコールを持つファイルシステム (例: cifs) で大きなプロジェクトを扱う場合に役立つことがあります。

コミットをマージする場合など、Git がインデックス内のこのファイルを変更する必要がある場合、Git は ( gracefully に) 失敗します。したがって、変更されたと仮定されたファイルがアップストリームで変更された場合、手動で状況を処理する必要があります。

--really-refresh

--refresh と同様ですが、「assume unchanged」設定に関係なく、無条件に stat 情報をチェックします。

--[no-]skip-worktree

これらのフラグのいずれかが指定されている場合、パスに対して記録されているオブジェクト名は更新されません。代わりに、これらのオプションはパスの「skip-worktree」ビットを設定/解除します。詳細については、以下の「Skip-worktree bit」セクションを参照してください。

--[no-]ignore-skip-worktree-entries

--remove オプションが指定された場合でも、skip-worktree (別名「index-only」) エントリを削除しません。

--[no-]fsmonitor-valid

これらのフラグのいずれかが指定されている場合、パスに対して記録されているオブジェクト名は更新されません。代わりに、これらのオプションはパスの「fsmonitor valid」ビットを設定/解除します。詳細については、以下の「ファイルシステムモニター」セクションを参照してください。

-g
--again

インデックスエントリが HEAD コミットのものと異なるパスに対して、git update-index 自体を実行します。

--unresolve

マージ中に誤ってクリアされた場合、ファイルの 未マージ または 更新が必要 な状態を復元します。

--info-only

このフラグの後に続くすべての <file> 引数に対して、オブジェクトデータベースにオブジェクトを作成しません。それらのオブジェクト ID をインデックスに挿入するだけです。

--force-remove

作業ディレクトリにファイルが残っていても、インデックスからファイルを削除します。(--remove を暗示します。)

--replace

デフォルトでは、ファイル path がインデックスに存在する場合、git update-indexpath/file を追加しようとすることを拒否します。同様に、ファイル path/file が存在する場合、ファイル path を追加することはできません。--replace フラグを使用すると、追加しようとしているエントリと競合する既存のエントリは、警告メッセージとともに自動的に削除されます。

--stdin

コマンドラインからパスのリストを受け取る代わりに、標準入力からパスのリストを読み取ります。パスはデフォルトで LF (つまり、1行に1パス) で区切られます。

--verbose

インデックスに追加および削除されているものを報告します。

--index-version <n>

結果のインデックスを指定されたディスク上のフォーマットバージョンで書き出します。サポートされているバージョンは2、3、4です。現在のデフォルトバージョンは、git add -N などの追加機能が使用されているかどうかに応じて、2または3です。--verbose を使用すると、このコマンドの前後でインデックスファイルが使用するバージョンも報告します。

バージョン4では、単純なパス名圧縮が実行され、大規模なリポジトリでインデックスサイズが30%〜50%削減され、読み込み時間が短縮されます。Git は2012年10月にリリースされたバージョン1.8.0以降でこれをサポートしており、libgit2では2016年に、JGitでは2020年にサポートが追加されました。このマニュアルページの以前のバージョンでは「比較的若い」と表現されていましたが、今日では成熟した技術と見なされるべきです。

--show-index-version

ディスク上のインデックスファイルで使用されているインデックスフォーマットバージョンを報告します。上記の --index-version を参照してください。

-z

--stdin または --index-info と組み合わせた場合にのみ意味があります。パスは LF の代わりに NUL 文字で区切られます。

--split-index
--no-split-index

スプリットインデックスモードを有効または無効にします。スプリットインデックスモードが既に有効で、再度 --split-index が指定された場合、`$GIT_DIR/index` のすべての変更は共有インデックスファイルにプッシュバックされます。

これらのオプションは、core.splitIndex 設定変数 ( git-config[1] 参照) の値に関係なく有効になります。ただし、変更が設定値に反する場合、警告が発行されます。これは、次にインデックスが読み込まれるときに設定値が有効になり、オプションの意図された効果が失われるためです。

--untracked-cache
--no-untracked-cache

追跡されていないキャッシュ機能を有効または無効にします。有効にする前に、--test-untracked-cache を使用してください。

これらのオプションは、core.untrackedCache 設定変数 ( git-config[1] 参照) の値に関係なく有効になります。ただし、変更が設定値に反する場合、警告が発行されます。これは、次にインデックスが読み込まれるときに設定値が有効になり、オプションの意図された効果が失われるためです。

--test-untracked-cache

追跡されていないキャッシュが使用できることを確認するために、作業ディレクトリに対してのみテストを実行します。実際に使用したい場合は、その後で --untracked-cache または --force-untracked-cache または core.untrackedCache 設定変数を使用して、追跡されていないキャッシュを手動で有効にする必要があります。テストが失敗した場合、終了コードは1となり、何が意図通りに機能していないかを説明するメッセージが表示されます。それ以外の場合、終了コードは0となり、「OK」と表示されます。

--force-untracked-cache

--untracked-cache と同じです。以前のバージョンの Git では --untracked-cache--test-untracked-cache を暗黙的に含んでいたが、このオプションは無条件に拡張機能を有効にしていたため、以前のバージョンの Git との後方互換性のために提供されています。

--fsmonitor
--no-fsmonitor

ファイルシステムモニター機能を有効または無効にします。これらのオプションは、core.fsmonitor 設定変数 ( git-config[1] 参照) の値に関係なく有効になります。ただし、変更が設定値に反する場合、警告が発行されます。これは、次にインデックスが読み込まれるときに設定値が有効になり、オプションの意図された効果が失われるためです。

--

これ以降の引数をオプションとして解釈しません。

<file>

操作対象のファイル。. で始まるファイルは破棄されることに注意してください。./filedir/./file も含まれます。これを避けたい場合は、よりクリーンな名前を使用してください。ディレクトリが / で終わる場合や、パスに // が含まれる場合も同様です。

--REFRESH の使用

--refresh は、新しい sha1 ファイルを計算したり、モード/コンテンツの変更のためにインデックスを最新の状態にしたりすることはありません。しかし、--refresh はファイルの stat 情報をインデックスと「再一致」させるので、変更されていないファイルでも stat エントリが古い場合にインデックスを更新できます。

たとえば、git read-tree を実行した後、stat インデックスの詳細を適切なファイルにリンクするためにこれを行いたいでしょう。

--CACHEINFO または --INFO-ONLY の使用

--cacheinfo は、現在の作業ディレクトリにないファイルを登録するために使用されます。これは、最小限のチェックアウトマージに役立ちます。

モードと sha1 を持つパスにファイルがあるふりをするには、次のようにします。

$ git update-index --add --cacheinfo <mode>,<sha1>,<path>

--info-only は、オブジェクトデータベースに配置せずにファイルを登録するために使用されます。これは、ステータスのみのリポジトリに役立ちます。

--cacheinfo--info-only は両方とも同様に動作します。インデックスは更新されますが、オブジェクトデータベースは更新されません。--cacheinfo は、オブジェクトがデータベースにあるがファイルがローカルで利用できない場合に役立ちます。--info-only は、ファイルが利用可能であるが、オブジェクトデータベースを更新したくない場合に役立ちます。

--INDEX-INFO の使用

--index-info は、標準入力から複数のエントリ定義を供給できる、より強力なメカニズムであり、特にスクリプト用に設計されています。次の3つの形式の入力を受け取ることができます。

  1. mode SP type SP sha1 TAB path

    この形式は、git ls-tree の出力をインデックスに格納するためのものです。

  2. mode SP sha1 SP stage TAB path

    この形式は、上位ステージをインデックスファイルに配置するためのもので、git ls-files --stage の出力と一致します。

  3. mode SP sha1 TAB path

    この形式は現在、どの Git コマンドでも生成されていませんが、update-index --index-info では引き続きサポートされます。

上位ステージのエントリをインデックスに配置するには、まずパスの mode=0 エントリを供給してパスを削除し、次に3番目の形式で必要な入力行を供給する必要があります。

たとえば、このインデックスから開始すると

$ git ls-files -s
100644 8a1218a1024a212bb3db30becd860315f9f3ac52 0       frotz

--index-info に次の入力を与えることができます

$ git update-index --index-info
0 0000000000000000000000000000000000000000	frotz
100644 8a1218a1024a212bb3db30becd860315f9f3ac52 1	frotz
100755 8a1218a1024a212bb3db30becd860315f9f3ac52 2	frotz

入力の最初の行は、パスを削除するためにモードとして0を与えます。SHA-1 は適切にフォーマットされている限り重要ではありません。次に、2行目と3行目は、そのパスのステージ1とステージ2のエントリを与えます。上記の後、次のようになります。

$ git ls-files -s
100644 8a1218a1024a212bb3db30becd860315f9f3ac52 1	frotz
100755 8a1218a1024a212bb3db30becd860315f9f3ac52 2	frotz

「ASSUME UNCHANGED」ビットの使用

Git の多くの操作は、ファイルシステムに効率的な lstat(2) 実装があることに依存しており、作業ツリーファイルの st_mtime 情報を安価にチェックして、ファイルの内容がインデックスファイルに記録されているバージョンから変更されたかどうかを確認できるようにしています。残念ながら、一部のファイルシステムには非効率な lstat(2) があります。もしお使いのファイルシステムがその一つである場合、変更していないパスに「assume unchanged」ビットを設定することで、Git がこのチェックを行わないようにすることができます。このビットをパスに設定しても、Git がファイルの内容をチェックして変更されたかどうかを確認するわけではないことに注意してください。Git は一切のチェックを省略し、変更されていないと 仮定 します。作業ツリーのファイルを変更する場合は、変更する前または後に「assume unchanged」ビットを解除して、明示的に Git にそのことを伝える必要があります。

「assume unchanged」ビットを設定するには、--assume-unchanged オプションを使用します。解除するには、--no-assume-unchanged を使用します。「assume unchanged」ビットが設定されているファイルを確認するには、git ls-files -v を使用します ( git-ls-files[1] 参照)。

このコマンドは core.ignorestat 設定変数を参照します。これが true の場合、git update-index paths... で更新されたパス、およびインデックスと作業ツリーの両方を更新する他の Git コマンド (例: git apply --indexgit checkout-index -ugit read-tree -u) で更新されたパスは、自動的に「assume unchanged」としてマークされます。「assume unchanged」ビットは、git update-index --refresh が作業ツリーのファイルがインデックスと一致すると判断した場合、設定されない ことに注意してください (git update-index --really-refresh を使用して「assume unchanged」としてマークしたい場合)。

ユーザーは時々、assume-unchanged ビットと skip-worktree ビットを混同します。違いの説明については、以下の「Skip-worktree bit」セクションの最後の段落を参照してください。

既にチェックアウトされているファイルのみを更新およびリフレッシュするには

$ git checkout-index -n -f -a && git update-index --ignore-missing --refresh
core.ignorestat が設定された非効率的なファイルシステム上
$ git update-index --really-refresh              (1)
$ git update-index --no-assume-unchanged foo.c   (2)
$ git diff --name-only                           (3)
$ edit foo.c
$ git diff --name-only                           (4)
M foo.c
$ git update-index foo.c                         (5)
$ git diff --name-only                           (6)
$ edit foo.c
$ git diff --name-only                           (7)
$ git update-index --no-assume-unchanged foo.c   (8)
$ git diff --name-only                           (9)
M foo.c
  1. インデックスと一致するパスに対して「assume unchanged」ビットを設定するために lstat(2) を強制します。

  2. 編集するパスをマークします。

  3. これは lstat(2) を実行し、インデックスがパスと一致することを見つけます。

  4. これは lstat(2) を実行し、インデックスがパスと 一致しない ことを発見します。

  5. 新しいバージョンをインデックスに登録すると、「assume unchanged」ビットが設定されます。

  6. そして、それは変更されていないと仮定されます。

  7. 編集した後でも。

  8. 後から変更を伝えることができます。

  9. これで lstat(2) を使ってチェックし、変更されたことを発見します。

SKIP-WORKTREE ビット

Skip-worktree ビットは、一つの (長い) 文で定義できます。合理的に可能な限りファイルを作業ディレクトリに書き込まないように Git に指示し、作業ディレクトリにファイルが存在しない場合は変更されていないものとして扱います。

すべての Git コマンドがこのビットに注意を払うわけではなく、一部は部分的にしかサポートしていないことに注意してください。

skip-worktree ビットに関連する update-index フラグと read-tree 機能は、git-sparse-checkout[1] コマンドが導入される前から存在していました。このコマンドは、skip-worktree ビットを設定および処理するはるかに簡単な方法を提供します。リポジトリ内のファイルの一部のみを扱うように作業ツリーを減らしたい場合は、低レベルの update-index および read-tree プリミティブよりも git-sparse-checkout[1] の使用を強くお勧めします。

skip-worktree ビットの主な目的は、sparse checkouts を有効にすること、つまり、パスの一部のみが存在する作業ディレクトリを持つことです。skip-worktree ビットが設定されている場合、Git コマンド (例: switchpullmerge) はこれらのファイルを書き込みません。ただし、マージまたはリベース中の競合など、重要なケースではこれらのコマンドがこれらのファイルを書き込むことがあります。また、Git コマンドは、これらのファイルの欠如を意図的な削除として扱いません。たとえば、git add -u はこれらのファイルの削除をステージングせず、git commit -a もそれらを削除するコミットを作成しません。

このビットは assume-unchanged ビットと似ていますが、その目的は異なります。assume-unchanged ビットは、ファイルを作業ツリーに残したまま、Git がその変更をチェックするのを省略し、ファイルが変更されていないと推定するためです (ただし、ファイルを stat せずに変更されたと判断できる場合は、変更を自由に記録できます)。skip-worktree は、Git にファイルの欠如を無視させ、通常作業ディレクトリの多くを更新するコマンド (例: checkoutswitchpull など) で可能な限り更新を避け、その欠如がコミットに記録されないようにします。疎なチェックアウト ( git sparse-checkout または core.sparseCheckout を true に設定することで設定) では、インデックスでファイルが skip-worktree とマークされているにもかかわらず作業ツリーで見つかった場合、Git はそのファイルの skip-worktree ビットをクリアすることに注意してください。

スプリットインデックス

このモードは、非常に大きなインデックスを持つリポジトリ向けに設計されており、これらのインデックスを繰り返し書き込むのにかかる時間を短縮することを目的としています。

このモードでは、インデックスは `$GIT_DIR/index` と `$GIT_DIR/sharedindex.` の2つのファイルに分割されます。変更はスプリットインデックスである `$GIT_DIR/index` に蓄積され、共有インデックスファイルはすべてのインデックスエントリを含み、変更されません。

スプリットインデックス内のすべての変更は、スプリットインデックス内のエントリ数が splitIndex.maxPercentChange 設定変数 ( git-config[1] 参照) で指定されたレベルに達すると、共有インデックスファイルにプッシュバックされます。

新しい共有インデックスファイルが作成されるたびに、その修正時刻が splitIndex.sharedIndexExpire 設定変数 ( git-config[1] 参照) で指定されたものよりも古い場合、古い共有インデックスファイルは削除されます。

まだ使用されている共有インデックスファイルを削除しないように、新しいスプリットインデックスが共有インデックスファイルに基づいて作成または読み込まれるたびに、その修正時刻は現在の時刻に更新されます。

追跡されていないキャッシュ

このキャッシュは、git status のような、追跡されていないファイルを特定するコマンドの速度を向上させることを目的としています。

この機能は、作業ツリーディレクトリの mtime を記録し、mtime が変更されていないディレクトリ内のファイルを読み込んだり、stat 呼び出しを行ったりするのを省略することで機能します。これが機能するためには、基盤となるオペレーティングシステムとファイルシステムが、ディレクトリ内のファイルが追加、変更、または削除された場合にディレクトリの st_mtime フィールドを変更する必要があります。

ファイルシステムがそれをサポートしているかどうかは、--test-untracked-cache オプションでテストできます。--untracked-cache オプションは、Git の以前のバージョンでは暗黙的にそのテストを実行していましたが、現在はそうではありません。

この機能を有効 (または無効) にしたい場合は、各リポジトリで git update-index--untracked-cache オプションを使用するよりも、core.untrackedCache 設定変数 ( git-config[1] 参照) を使用する方が簡単です。特に、使用するすべてのリポジトリでそうしたい場合は、$HOME/.gitconfig で一度 true (または false) に設定するだけで、操作するすべてのリポジトリに影響を与えることができます。

core.untrackedCache 設定変数が変更された場合、次にコマンドがインデックスを読み込むときに追跡されていないキャッシュがインデックスに追加または削除されます。一方、--[no-|force-]untracked-cache が使用された場合、追跡されていないキャッシュは直ちにインデックスに追加または削除されます。

2.17以前の追跡されていないキャッシュには、ディレクトリを別のディレクトリへのシンボリックリンクで置き換えると、Git によって追跡されているファイルを追跡されていないものとして誤って表示するバグがありました。git.git の「status: add a failing test showing a core.untrackedCache bug」コミットを参照してください。その回避策は (そしてこれは将来発見される他のバグにも機能するかもしれません)

$ git -c core.untrackedCache=false status

このバグは、追跡されていないキャッシュの内部構造に関する限り、ディレクトリをファイルで置き換える非シンボリックリンクのケースにも影響することが示されていますが、これが間違った「git status」出力につながったケースは報告されていません。

また、2.17より前のGitバージョンで書き込まれた既存のインデックスが、もはや存在しないディレクトリを参照しているケースもあり、「git status」で多くの「could not open directory」警告が印刷される可能性があります。これらは、以前は静かに破棄されていた既存の問題に対する新しい警告です。

上記のバグと同様に、解決策は、残りの不良データをフラッシュするために、core.untrackedCache=false を使用して「git status」を一度実行することです。

ファイルシステムモニター

この機能は、大規模な作業ディレクトリを持つリポジトリの Git 操作を高速化することを目的としています。

これにより、Git はファイルシステムモニター (git-fsmonitor--daemon[1] および githooks[5] の「fsmonitor-watchman」セクションを参照) と連携して、どのファイルが変更されたかを通知することができます。これにより、Git はすべてのファイルを lstat() して変更されたファイルを検索する手間を省くことができます。

追跡されていないキャッシュと組み合わせて使用​​すると、作業ディレクトリ全体をスキャンして新しいファイルを探すコストを回避できるため、パフォーマンスをさらに向上させることができます。

この機能を有効 (または無効) にしたい場合は、各リポジトリで git update-index--fsmonitor オプションを使用するよりも、core.fsmonitor 設定変数 ( git-config[1] 参照) を使用する方が簡単です。特に、使用するすべてのリポジトリでそうしたい場合は、$HOME/.gitconfig で一度設定変数を設定するだけで、操作するすべてのリポジトリに影響を与えることができます。

core.fsmonitor 設定変数が変更された場合、次にコマンドがインデックスを読み込むときにファイルシステムモニターがインデックスに追加または削除されます。--[no-]fsmonitor が使用された場合、ファイルシステムモニターは直ちにインデックスに追加または削除されます。

設定

このコマンドは core.filemode 設定変数を尊重します。リポジトリが実行可能ビットが信頼できないファイルシステム上にある場合、これは false に設定する必要があります ( git-config[1] 参照)。これにより、コマンドは、インデックスに記録されたファイルモードとファイルシステムのファイルモードが実行可能ビットのみで異なる場合、それらの違いを無視します。そのような不運なファイルシステムでは、git update-index --chmod= を使用する必要があるかもしれません。

同様に、core.symlinks 設定変数が false に設定されている場合 ( git-config[1] 参照)、シンボリックリンクは通常のファイルとしてチェックアウトされ、このコマンドは記録されたファイルモードをシンボリックリンクから通常のファイルに修正しません。

このコマンドは core.ignorestat 設定変数を参照します。上記の「"assume unchanged" ビットの使用」セクションを参照してください。

このコマンドは core.trustctime 設定変数も参照します。inode 変更時刻が Git の外部で定期的に変更される場合 (ファイルシステムクローラーやバックアップシステムは処理されたファイルをマークするために ctime を使用します) に役立ちます ( git-config[1] 参照)。

追跡されていないキャッシュ拡張機能は、core.untrackedCache 設定変数 ( git-config[1] 参照) で有効にできます。

注記

ユーザーは、追跡されているファイルへの変更を Git に無視させるために、assume-unchanged および skip-worktree ビットを使用しようとすることがよくあります。これは期待どおりには機能しません。Git は特定の操作を実行するときに、作業ツリーのファイルをインデックスと比較する場合があります。一般的に、Git は追跡されているファイルへの変更を無視する方法を提供しないため、代替ソリューションが推奨されます。

たとえば、変更したいファイルが設定ファイルの一種である場合、リポジトリにはサンプル設定ファイルを含めることができ、それを無視された名前にコピーして変更できます。リポジトリには、サンプルファイルをテンプレートとして扱い、自動的に変更してコピーするスクリプトを含めることさえできます。

GIT

git[1]スイートの一部

scroll-to-top