雑記
【Git】commitの履歴ログを削除する方法
きーぼう
公開日:2022/10/27
こんにちは、きーぼうです。
間違えて大量のPDFファイルをcommitしてしまい、その内容を削除するためにてんやわんやしたので
今後の自分のためにもまとめてみました。
今回のやり方は、パスワードなどの機密情報をcommitしてしまった場合にも有効かと思います。
※完全に解決できてないので、参考程度にお願いします。
目次
やり方
- コミットの書き換えを行う
- git filter-branch –index-filter ‘git rm –cached –ignore-unmatch filename’ HEAD
- リポジトリを最適化
- git gc –aggressive –prune=now
- 変更内容を強制的に push
- git push -f
- ※複数人で利用している場合
- 他の人には、対象のリポジトリをcloneでつくりなおしてもらう。
実際に実施してみて気づいたこと
- リポジトリの歴史が古いとその分実行時間がかかる
- git filter-branchを実施した際に対象ファイルが6000件くらいあり、90分ほどかかりました。
- git gcは、10分ほどで完了しました。
gitコマンドのオプションについて
filter-branch
- –index-filter
- インデックスを書き換える
- ツリーをチェックアウトせずインデックスを書き換えるので、–tree-filterよりはるかに高速
- –tree-filter
- 各チェックアウトに対してコマンドを実行し、結果を再コミットする
- working tree
- git addする前のファイル
git rm
- –cached
- インデックスに登録されたファイルに対して削除を行う
- ファイルを手元に残したい時に使用
- –ignore-unmatch
- 削除したいファイルが存在しない場合でも、0 (成功) を返します
- 当てはまる対象がない時のエラーを無視できる
git gc
- –aggressive
- より積極的に最適化する
- –prune=
- 日付より古いオブジェクトを gc.pruneExpireする。
- –prune = nowは、古くなったオブジェクトを経過時間に関係なく削除する。
- –pruneはデフォルトでオン