git add
には、同等の配管コマンドはありませんが、最も近いものはおそらくgit update-index
です。 ProGitの説明は正しいです。
各ディレクトリをディレクトリの内容のリストに置き換えてください。結果はadd
で指定されたファイルのリストであり、ディレクトリ内のではなくではないことが判明しているファイルや、特殊インデックス状態のファイル(--assume-unchanged
と--skip-worktree
)の特殊な扱いがあります。つまり、このステップでは現在のインデックスも参照します。
は
unstaged-たが、無視(.gitignore
経由)ファイルをチェックし、-f
/--force
を与えない限り、(警告付き)のリストからそれらを捨てます。
(これはサブディレクトリではこれをテストしていないため、再帰スキャンで選択されたサブディレクトリエントリには適用されませんが、コマンドラインで実際に指定された名前にのみ適用される可能性があります。場合は、手順2を手順1と組み合わせて、-f
でも無視する場合は名前を追加しないようにする必要があります。
属性がある場合はそれを適用し、必要に応じてファイルを一時的に消去します。
git update-index --add --remove --replace
を使用して、モード更新を含むインデックスエントリが更新されたリポジトリに書き込まれた変更ファイルを取得します。 (手順3でクリーニングされたファイルの場合は、提案したように別のgit hash-object -w
を使用し、--add --remove --replace
の代わりに--index-info
を使用する必要があります。--index-version
を参照)、インデックス自体が難文書フォーマットを使用して、単にフラットファイル(またはより正確には、いくつかのフォーマットの一つとして)
git mktree
コマンドは、まったくこのプロセスに入りません。
インデックスには、ステージと呼ばれるファイル名ごとに最大4つのエントリがあります。ステージ0は通常のキャッシュエントリであり、ステージ1〜3は競合するマージです。ファイルを削除するための特別なビットがいくつかあります:--assume-unchanged
、--skip-worktree
、--intent-to-add
、およびいくつかの特別な内部使用フラグ。Gitはディレクトリを格納していませんが、Gitはctime
Gitはこれを維持するためにOSを信頼することができるならば、変更されていないディレクトリをすばやくスキップすることができます)。
git mktree
コマンドは、インデックスを一連のツリーオブジェクトに変換するときのみ有効です。 Gitは、インデックス内の各サブディレクトリに対して1つのツリーと、全体インデックスを表す1つのトップレベルツリーを作成する必要があります。 (サブプロジェクトがあれば、すでに存在していれば "gitlink"エントリーとしてインデックスに入っています)。
Gitはdiffを実行するたびにすべてを再帰的に検索しますか?または 'add'など? – Geremia