似たような記事が100本以上ありそうですが、駆け出しエンジニア(死語?)向けにあらためてまとめました。
状況設定
説明のため、以下のような状況を考えます。
- Serverless Frameworkデプロイ時に生成される
.serverless
というサブディレクトリ内のファイルに、APIキーの情報が含まれてしまった。 -
.serverless
サブディレクトリは本来Git管理すべきではないのに、誤ってリモートリポジトリにプッシュしてしまった。 - git-flowによるブランチ管理を行っており、複数のfeatureブランチも存在している。
手順1: 該当ディレクトリをGit管理から外す
git-flowのため、最新のdevelopブランチからfeatureブランチをきります。
このfeatureブランチで、.serverless
ディレクトリを削除します。
git rm -r --cached .serverless
.gitignore
ファイルに.serverless
を追加して、将来のコミットでこのディレクトリが無視されるようにします。
echo ".serverless" >> .gitignore
変更をコミット後、リモートプッシュしてdevelopにマージします。
最新developを作業中のfeatureブランチにマージして、同様に.serverless
をGit管理から外します。
※この操作を忘れてしまうと、featureを最新developにマージした際、.serverless
と.gitignore
が元に戻ってしまいます。
あとはgit-flowにのっとって、develop -> staging -> mainの順にマージすれば、アクティブなブランチから.serverless
がなくなります。
手順2: git-secretsの導入
すべての開発メンバーにgit-secrets
を導入してもらいます。
git-secrets
によって、機密情報が含まれたコミットがプッシュされる前に、検出とブロックが行われます。
※本来は、開発者がリポジトリをクローンしたときに導入するものです。
まずは、すべての開発メンバーにgit-secrets
をインストールするように指示します。
インストール方法はプラットフォームによって異なります。
# macOS
brew install git-secrets
# Linux
git clone https://github.com/awslabs/git-secrets.git
cd git-secrets
make install
メンバー各自で、ローカルリポジトリで次のコマンドを実行し、git-secrets
を有効化します。
cd <your_repository>
git secrets --install
git secrets --register-aws
通常、git-secrets
はインストール時にグローバル設定として有効化されます。
そのため、新しいfeatureブランチを作成する際にgit-secrets --install
とgit secrets --register-aws
を再実行する必要はありません。
手順3: リモートリポジトリにある非アクティブなブランチの削除
リモートブランチに無駄に残ってしまっているブランチを忘れずに削除しましょう。
手順4: 過去のコミット履歴から機密情報を削除する
git filter-branch
を使用して、機密情報が含まれる過去のコミットを書き換えます。
git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch .serverless' --prune-empty --tag-name-filter cat -- --all
.serverless
ディレクトリが含まれるすべての過去のコミットから、そのディレクトリを削除します。
他の開発者のリポジトリには影響しないため、リモートリポジトリに強制プッシュする必要があります。
git push origin --force --all
git push origin --force --tags
※BFG Repo-Cleanerのようなツールでも同様の操作ができるみたいです。