Gitコミットにパスワード等の秘匿情報を入れてしまったあなたへ
作業をしてたらなんかパスワードが直書きされてるファイルを見つけてしまった!
しかもだいぶ昔のコミットから入っていて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]
皆さんが「やっちまったあああっ!!」な状態でこの記事を二度と開くことが無いよう、心からお祈り申し上げます。🙏
-
私自身、記憶してる限りでこの作業を生涯3回ほどしてる...いい加減繰り返したくない。 ↩︎
Discussion