あなたがの歴史から始めたとしましょう
$ git lola --name-status
* e709131(HEAD、マスター)バー
| バー
* 61493acABC/ファイル-3.ext
| ABC/ファイル-3.ext
* 34cce9eABC/ファイル-2.ext
| ABC/ファイル-2.ext
* 115e6d5ABC/ファイル-1.ext
| ABC/ファイル-1.ext
* 5ea5b42 foo
foo
注:git lolaは非標準ですが、非常に便利なエイリアスです。
git rm
サブツリーを削除するためのオプションをサポートします。
-r
先頭のディレクトリ名が指定されている場合は、再帰的な削除を許可します。
走った後
$ git filter-branch --index-filter'git rm --cached -r --ignore-unmatch ABC' \
--prune-empty --tag-name-filter cat --- all
に似た出力が表示されます
115e6d5cd06565ca08f1e5c98c4b91246cf59fa1(2/5)rm'ABC/file-1.ext'を書き換えます
34cce9e90f832460137e620ebacc8a73a99e64ce(3/5)rm'ABC/file-1.ext'を書き換えます
rm'ABC/ファイル-2.ext'
61493ac3211808f34f616dbc33d51d193b3f45a3(4/5)rm'ABC/file-1.ext'を書き換えます
rm'ABC/ファイル-2.ext'
rm'ABC/ファイル-3.ext'
e709131f1fe6103adf37616c9fa500994aeb30d0(5/5)rm'ABC/file-1.ext'を書き換えます
rm'ABC/ファイル-2.ext'
rm'ABC/ファイル-3.ext'
Ref'refs / heads/master'が書き直されました
結果に満足している場合は、で古いマスターを削除します
$ git update-ref -d refs / original / refs / heads / master
そして今、あなたはの歴史を持っています
$ git lola --name-status
* 19680d4(HEAD、マスター)バー
| バー
* 5ea5b42 foo
foo
2番目の質問に答えるために、削除したいABC/file - 2.ext
だけだと言います。2層の引用符が必要になることを忘れないでください。1つはコマンド全体用で、もう1つはそのコマンドの引数のスペース(削除するファイルの名前)をエスケープするためのものです。
そのための1つの方法は
$ git filter-branch --index-filter \
'git rm --cached --ignore-unmatch "ABC / file-2.ext"' --prune-empty \
--tag-name-filter cat --- all
一重引用符内の二重引用符に注意してください。
代わりにこのコマンドを実行した場合、履歴は次のようになります。
$ git lola
* a8d1b0d(HEAD、マスター)バー
* cff0c4e ABC /file-3.ext
* 115e6d5ABC/ファイル-1.ext
* 5ea5b42 foo