GitHub を使用している場合、あるコードをコミットする際に「機密情報」を誤って公共リポジトリにコミットしてしまった場合の対処方法を説明します。
もし、ローカルでコミットした後に GitHub リモートリポジトリにプッシュする前に気付いた場合、この場合は簡単に処理できます。コードを修正し、git commit --amend
コマンドを使用して修正します。
しかし、GitHub リモートリポジトリにプッシュされていた場合や、時間が経過し、後続のコミットが多く行われた場合は、より複雑な処理が必要です。
- ステップ 1
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch ファイルのパス(プロジェクトの相対パス)" --prune-empty --tag-name-filter cat -- --all
以下の例:
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch ./picgo/20220418121957.png' --prune-empty --tag-name-filter cat -- --all
- --force:操作を強制的に実行し、一部のコミットが失われる可能性があります。
- --index-filter:インデックスを操作して履歴を変更します。後ろの 'git rm --cached --ignore-unmatch ./picgo/20220418121957.png' は、実行する具体的なコマンドを示しており、指定したパスに対応するファイルを削除します。
- --prune-empty:処理中に空のコミットを削除します。
- --tag-name-filter:タグを操作します。cat はタグ名を変更しないことを示します。
- -- --all:コマンドをすべてのブランチとタグに適用します。
- ステップ 2
すべてのブランチとタグを強制的にプッシュします。
git push origin --force --all
git push origin --force --tags
- ステップ 3
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin #refs/original参照の各参照を削除します
git reflog expire --expire=now --all #すべての参照(ブランチ、タグなど)のreflogをクリーンアップします。reflogは参照の移動やリセットなどの操作履歴を記録しています
git gc --prune=now #不要なオブジェクトをクリーンアップするためのガベージコレクションを実行します