Zenn
🙏

Gitコミットにパスワード等の秘匿情報を入れてしまったあなたへ

2025/03/24に公開

作業をしてたらなんかパスワードが直書きされてるファイルを見つけてしまった!
しかもだいぶ昔のコミットから入っていてGit履歴に大量に残ってる!!
うおおおおやらかしてしまっあああぁ!!!!1
...なあなたへ

tl;dr

探す

git grep "パスワード文字列" $(git rev-list --all)

git rev-list --all はリポジトリサイズ次第では相当重たいコマンドなので注意!

置換

置換サブコマンドのインストール (homebrew)

公式の git filter-branch を使うと上記を進められるのでインストール。

 brew install git-filter-repo

置換コマンド

git filter-repo --replace-text <(echo 'パスワード文字列==>置き換えたい文字列')

実行時に(意図的に) リモートブランチが外されます。
この時点で意図した変更が行われているか、上記 探す で紹介したコマンドで確認するとよいです。

force push

リモートを再度追加

git remote add origin REMOTE_URL

強制上書きpush

git push -f origin 'pushしたいbranch'

複数 branch に対して行う場合は xargs 等で一括して force-push することも可能です。
が、慎重に行うべきコマンドなのでここでは紹介しません。

対応完了後にリモート側プロテクトの復旧、チームリポジトリの場合は全体周知・各位リモートへの反映で対応完了となります。

再発防止策: git pre-commit 時に検出してコミットさせない

できれば上記のようなピリついた作業はしたくない。未然に防ぐため禁止ワードを改行区切りで記載したファイルを用意し、 git commit 時に検出できるようにします。
対象のリポジトリに .git/hooks/pre-commit ファイルを用意し下記を反映させます:

5行目 には弾きたい禁止ワードを記載したファイルを用意します。
(このファイルをリポジトリ管理しないようにくれぐれも気をつけてください)

最後に pre-commit ファイルに実行権限を付与すれば git commit 時に動作するようになります:

chmod +x /path/to/repository/.git/hooks/pre-commit

さいごに

今回、個人の dotfiles リポジトリを編集中にパス内に個人名が書かれていたのが気になったので対応したのがきっかけでした。(プライベートリポジトリとはいえ恥ずかしかったので対応しました)

ただこれだけだとn番煎じなので、ついでに簡単ですが再発防止策の案も掲載させていただきました。
後の祭りでこの記事にたどり着いた方はもちろん、秘匿する情報を取り扱う全エンジニアがこういった予防線を敷いて置けると精神的にゆとりを持って作業できると思うのでぜひ広めていただければ幸いです (ダイレクトマーケティング)

最後の最後にやらかした皆さんへ: (私を含む)[1]
皆さんが「やっちまったあああっ!!」な状態でこの記事を二度と開くことが無いよう、心からお祈り申し上げます。🙏

脚注
  1. 私自身、記憶してる限りでこの作業を生涯3回ほどしてる...いい加減繰り返したくない。 ↩︎

Discussion

ログインするとコメントできます