秘密情報(APIキーなど)を記載したファイルをプッシュしてしまった場合にgit-filter-repoを使った対応方法を記載する。

はじめに

秘密情報(APIキーなど)を記載したファイルをプッシュしてしまった場合にgit-filter-repoを使った対応方法を記載する。

問題

秘密情報(APIキーなど)を記載したファイルをプッシュしてしまったなど、Gitの履歴を修正したい。

解決

秘密情報(APIキーなど)を記載したファイルをconfig.iniとした場合の例を記載する。 ただし、過去に遡って履歴が改変されてしまうため、使い方には厳重に注意したい。

git filter-repoのインストール

github.com

上記 を参考にパッケージでインストールする。

$ sudo apt install -y git-filter-repo

#確認
$ git-filter-repo --version
22826b5a68b6

使い方、特定のファイルを全ての履歴から削除する

htmlpreview.github.io

上記に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

これで秘密情報、加えて履歴を削除できた。

参考

sleepost.hatenablog.com