markharness

0047: impact --worktreeは未追跡のファイルも含め、コミットした時と同じ変更を見る

ステータス

Accepted(2026-10-12決定)。0046の決定2(未追跡のファイルを対象外とする)と、決定3の一時インデックスの作り方(git add -u)を置き換える。0046のそれ以外の決定は変わらない。

背景

0046のimpact --worktreeは、追跡されているファイルだけを対象にした。そのため、knowledge/に新しい要求やFeatureを作った直後は、git addしないと影響を確かめられなかった(Issue #131)。作業者が確かめたいのは「今コミットしたら、どう見えるか」であり、新規ファイルだけがgit addの有無で見えたり見えなかったりするのは、その期待とずれる。0046は「未追跡のファイルも含める」を、.gitignoreとの整合を決める必要があるとして初期実装の範囲外にしていたが、git add -Aがその整合を自動で処理するので、決める必要はなくなる。

決定

1. 未追跡のファイルも対象にする

対象は、作業者がgit add -Aしてコミットした場合に得られるツリーとする。ステージ済み・未ステージ・未追跡を区別せず、.gitignoreで無視されないすべてのファイルの作業ツリー上の現在の内容を対象にし、削除も反映する。無視すべきファイルの判定はgit add -Aに任せ、markharnessは持たない。無視したいファイルは.gitignoreに書く。

2. 範囲はリポジトリ全体とする

.markharness/knowledgeに限らず、リポジトリ全体にgit add -Aをかける。外部要求のsource_locatorが指す.sdocのようにknowledge/の外にあるファイルも、コミットした時と同じ見え方にするためである。knowledge/だけに限ると、それらの未コミットの変更だけが食い違って見える。

3. 一時インデックスは実インデックスのコピーから作る

実インデックスのコピーをGIT_INDEX_FILEに指定し、git add -A、git write-treeの順に実行する。空のインデックスから作らないのは、追跡中なのに.gitignoreに該当するファイルを、実際のコミットと同じくツリーに残すためである。0046の決定3のうち、git add -uをgit add -Aに変えるだけで、それ以外(ツリーOIDを既存のref向けの処理にそのまま渡すこと、実インデックスとHEADを変更しないこと)は変わらない。

4. オブジェクトDBへの書き込みを抑えるガードは設けない

未追跡のファイルのblobもオブジェクトDBに書き込まれる。.gitignoreに入れていない大きなファイル(ビルド成果物や動画など)があると、実行のたびにそのハッシュ計算と書き込みが発生する。サイズ上限、警告、--include-untrackedのようなopt-inは設けない。git add -Aも同じ挙動であり、現時点でそのようなファイルが問題になった事例はない(YAGNI)。代わりに、見積もりと「無視すべきファイルは.gitignoreに書く」ことをcli-manualに明記する。書き込まれるblobのうち参照されないものはgit gcが回収する。

影響範囲

検討したが採用しない選択肢