2018-05-26 (土)
[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
感謝
関連記事
新着記事