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 # ガベージコレクションを実行し、不要なオブジェクトをクリーンアップします