はじめに
秘密情報(APIキーなど)を記載したファイルをプッシュしてしまった場合にgit-filter-repoを使った対応方法を記載する。
問題
秘密情報(APIキーなど)を記載したファイルをプッシュしてしまったなど、Gitの履歴を修正したい。
解決
秘密情報(APIキーなど)を記載したファイルをconfig.iniとした場合の例を記載する。 ただし、過去に遡って履歴が改変されてしまうため、使い方には厳重に注意したい。
git filter-repoのインストール
上記 を参考にパッケージでインストールする。
$ sudo apt install -y git-filter-repo #確認 $ git-filter-repo --version 22826b5a68b6
使い方、特定のファイルを全ての履歴から削除する
上記にgit-filter-repo の使い方が記載されている。
今回は使い方の例として、特定のファイルを全ての履歴から削除する方法を記載する。
まず、操作対象のレポジトリをクローンする。
$ git clone git@github.com:<レポジトリ名>.git $ cd <レポジトリ名> #ファイルの確認 $ ls config.ini $ git log -1 commit dcf91448e6836fe789bd9649c9284ae2657e6b78 (HEAD -> main, origin/main, origin/HEAD) (省略) add config.ini
特定のファイルとして、config.iniを全ての履歴から削除する
#ファイル名を定義 $ FILENAME=config.ini $ echo $FILENAME config.ini #履歴から削除 $ git filter-repo --path $FILENAME --invert-paths Parsed 15 commits New history written in 0.03 seconds; now repacking/cleaning... Repacking your repo and cleaning out old unneeded objects HEAD is now at 0c352ce Update test4.txt for Rebase and merge Enumerating objects: 32, done. Counting objects: 100% (32/32), done. Delta compression using up to 8 threads Compressing objects: 100% (15/15), done. Writing objects: 100% (32/32), done. Total 32 (delta 12), reused 18 (delta 7), pack-reused 0 Completely finished after 0.10 seconds. #確認 $ ls (config.iniを確認できず) $ git log -1 (config.iniに関するコミットが削除されている)
プッシュする
履歴の改変をしたブランチはリモートリポジトリにあるブランチと確実に違うので強制プッシュ(force push)する必要がある。 加えて、コマンドを実行したあとは、安全のためにリモートオリジンの設定が消える。そのため、リモートも改変したい場合は以下のように実行する。
$ git remote add origin git@github.com:<レポジトリ名>.git #確認 $ git remote -v origin git@github.com:<レポジトリ名>.git (fetch) origin git@github.com:<レポジトリ名>.git (push) #プッシュ $ git push -f origin main
これで秘密情報、加えて履歴を削除できた。