B3S
menu close

雑記

【Git】commitの履歴ログを削除する方法


きーぼう

公開日:2022/10/27


こんにちは、きーぼうです。
間違えて大量のPDFファイルをcommitしてしまい、その内容を削除するためにてんやわんやしたので
今後の自分のためにもまとめてみました。

今回のやり方は、パスワードなどの機密情報をcommitしてしまった場合にも有効かと思います。
※完全に解決できてないので、参考程度にお願いします。

目次

やり方

  1. コミットの書き換えを行う
    • git filter-branch –index-filter ‘git rm –cached –ignore-unmatch filename’ HEAD
  2. リポジトリを最適化
    • git gc –aggressive –prune=now
  3. 変更内容を強制的に push
    • git push -f
  4. ※複数人で利用している場合
    • 他の人には、対象のリポジトリを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はデフォルトでオン