ざこノート
2018-05-26 [Git]

[Git] 歴史上から特定のファイルを削除する

git filter-branch –index-filterを使用して、過去からファイル/フォルダを消し去ります。
ファイル名にスペースが含まれる場合は注意です。
–tree-filterより高速です。

環境

  • Windows 10 Pro 64bit 1709
  • Git 2.17.1.windows.1

結果

x x/a'b.txtファイル と yyyフォルダを削除する例です。

# チェックアウトしているブランチに実行
git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch 'x x/a''b.txt' yyy/" --prune-empty HEAD

# 全てのブランチに実行
git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch 'x x/a''b.txt' yyy/" --prune-empty -- --all
  • ファイル名にスペースがある場合は、'x x'のように'で囲む。
  • ファイル名に'がある場合は、''でエスケープする。
  • フォルダを指定する場合は、yyy/のようにする。
  • --HEADではなく-- --allを指定すると、全てのブランチが対象。

必要に応じて、以下を実行します。

# filter-branchで歴史上からファイルを抹消したら
# リポジトリを最適化(不要なオブジェクトを削除)
git gc --aggressive --prune=now

# filter-branchでコミットのハッシュ値が変わるので
# 強制的にプッシュし直す (複数人でリポジトリを使用している場合は注意)
git push -f

方法

以下のファイル/フォルダを削除する例です。

├ himitsu ← フォルダごと削除
│ ├ xxx
│ └ xxx
├ static
│ ├ spa ce.png ← あるフォルダのスペースを含むファイルを削除
│ └ yyy
├ abc.txt ← ファイルを削除
└ a'b.txt ← 'が含まれるファイルを削除
git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch himitsu/ 'static/spa ce.png' abc.txt 'a''b.txt'" --prune-empty HEAD

感謝