git-safety について
git-safetyは、ステージ済みの変更を確認し、破壊的なGit操作を制御するスキルです。予防策の設定や、認証情報のローテーション後に確認を経て履歴を整理する手順も扱います。
主な機能
- 01ステージ済みファイルと追加行の秘密情報を検査
- 02破壊的なGit操作とバックアップを評価
- 03ignoreルールとコミット前フックを設定
- 04ローテーション後の確認済み履歴整理を案内
活用シーン
- 01コミット前のステージ済み変更の確認
- 02リセットや参照削除前のリスク評価
- 03以後のコミットへの機密ファイル混入防止
- 04ローテーション済み認証情報のGit履歴からの除去
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ shipshitdev/ skills --skill git-safetyインストール後、Claude Code で/git-safetyを入力して読み込まれたか確認します。
同梱ファイルreferences/full-guide.md
詳細
Git の安全対策
2 つのガードで、毎日作業しているリポジトリを守ります。
- ステージングガード — 機密情報が次のコミットに含まれないようにします。
- 操作ガード — 破壊的な git コマンドを、確認もバックアップもなしに実行させません。
どちらも定期的に実行します。すべてのブランチで、コミット時とプッシュ時に、継続して実行されます。リポジトリを公開する前に一度だけ全体を監査するのは別の場面です。関連項目を参照してください。
許可された範囲
ユーザーの依頼と既存の承認の範囲内でのみ行動してください。このスキルを読み込んでも、新たな権限は与えられません。レポートのみの依頼はレポートのみにとどめ、依頼者が指定した対象、ホスト、プロバイダー、コストの制限を守ってください。範囲を広げる前に確認し、これらの制限を委任先にも伝えてください。
契約
入力:
- リポジトリのルート
- モード:
scan、guard、prevent、clean、またはfull cleanの場合:漏洩したパスまたはシークレット文字列、および影響を受ける ref
出力:
- ステージングされた検出結果と、ファイルごとのブロック/許可判定
- 破壊的操作のリスク評価とバックアップコマンド
- すでにプッシュされたものに対する認証情報のローテーション手順
作成/変更対象:
scanとguard:ファイル変更なしprevent:.gitignore、.env.example、フックファイルclean:書き換えられた git 履歴。明示的な確認後に限ります
外部への副作用:
cleanモードでは、書き換えた履歴を強制プッシュする場合があります- リポジトリ外のシステムで認証情報のローテーションが必要です
確認が必要な操作:
- 履歴を書き換える前
- 強制プッシュ、またはリモートのコミットを破棄するプッシュの前
reset --hard、clean -fdx、ブランチ/タグの削除の前- 共有リポジトリのフックまたは無視ルールを変更する前
委任先:
- なし。プライベートリポジトリを公開する前に履歴全体の公開監査を、git の状態を超える脆弱性についてはアプリケーションセキュリティレビューを推奨してください。
委任された安全性チェックのモードは、デフォルトで scan または guard にしてください。フックのインストール、認証情報のローテーション、履歴の書き換えには、それぞれ個別の許可された操作が必要です。シークレットを発見しても、これらの変更が自動的に許可されるわけではありません。
まずローテーションする
git 履歴からシークレットを削除しても、安全になるわけではありません。一度プッシュされると:
- ボットは新しいプッシュを数秒以内にスクレイピングします
- アーカイブやミラーのサービスにスナップショットが残っている場合があります
- フォークには元の履歴が残ります
- CI/CD ログに値が残っている場合があります
履歴に手を加える前に、シークレットの発行元で認証情報をローテーションしてください。履歴の書き換えは後始末であり、封じ込めではありません。基準は、発行元のシステムが古い値を拒否することです。
モード
| モード | 実行時点 | 終了条件 |
|---|---|---|
scan | コミット前 | ステージングされたすべてのファイルと追加行が解除またはフラグ付けされている |
guard | 破壊的コマンドの前 | 影響範囲が示され、バックアップが作成され、実行者が確認している |
prevent | リポジトリごとに一度、その後は変更があったとき | 無視ルールとフックが既知の不正なテストコミットをブロックする |
clean | 漏洩の確認後、ローテーション後 | すべての ref からシークレットがなくなり、共同作業者に通知されている |
full | 新しいリポジトリの導入時 | scan → prevent が完了している |
scan — ステージングガード
対象は作業ツリーとステージングされた差分であり、履歴は対象外です。
# Files about to be committed
git diff --cached --name-only
# Sensitive filenames among them
git diff --cached --name-only | grep -iE '(^|/)\.env($|\.)|\.(pem|key|p12|pfx|secret)$|credentials|service-account|id_rsa|id_ed25519|\.npmrc$|kubeconfig'
# Secret-shaped values in added lines only
git diff --cached -U0 | grep -E '^\+' | grep -iE '(api[_-]?key|secret[_-]?key|client[_-]?secret|access[_-]?token|auth[_-]?token|password)[^a-z]{0,4}[=:][^=:]{8,}'
# Untracked files sitting in the tree that must never be added
git status --porcelain --untracked-files=all | grep -E '^\?\?' | grep -iE '\.env|\.pem$|\.key$|credentials|secrets\.'
検出項目ごとの判定:block(実際の認証情報)、allow(プレースホルダー、フィクスチャ、または例)、または差分だけでは値を分類できない場合は ask です。block の項目ごとにファイルと行を報告します。ステージングされたすべてのパスに判定が付いた時点で終了します。
guard — 破壊的操作のゲート
以下の操作は、いずれも Git では復元できない共同作業者の作業を書き換えるか、破棄します。
| コマンド | 破棄されるもの |
|---|---|
git push --force / --force-with-lease | 他の人が保持している可能性のあるリモートコミット |
git filter-repo, bfg | リポジトリ内のすべてのコミットハッシュ |
git reset --hard | 作業ツリーとインデックス内の未コミットの作業 |
git clean -fdx | ローカルの .env を含む、追跡対象外のファイル |
git checkout -- <path> | そのパスへの未コミットの編集 |
git branch -D, git push origin --delete | その参照にある未マージのコミット |
プッシュ済みブランチでの git rebase | 共同作業者に公開済みのコミット |
実行する前に、次のことを行います。
- 影響範囲を明示する — どの参照が変更され、誰のクローンに影響し、何が復元不能になるかを示します。
- バックアップする — 履歴を書き換える場合は
git clone --mirror . ../repo-backup-$(date +%Y%m%d)を実行します。reset --hardまたはclean -fdxの前にはgit stash -uを実行します。 - 元に戻せる形式を優先する —
--forceより--force-with-lease、プッシュ済みブランチでのreset --hardよりgit revert、checkout --よりgit stashを選びます。 - オペレーターに確認する — 実行するコマンドを正確に示して確認を得ます。
オペレーターが明示された影響範囲を確認するか、元に戻せる代替手段を使用した時点で終了します。
prevent — ガードを自動化する
除外ルールを追加し、pre-commit フックを作成し、.env.example を作成します。パターン、完全なフックスクリプト、および git secrets の設定は references/full-guide.md にあります。
ダミーの .env を使ったテスト用コミットがフックによって拒否された時点で終了します。
clean — 漏えい後に履歴を書き換える
ローテーションが確認された後にのみ実行し、上記の guard ゲート内でのみ実行します。
git clone --mirror . ../repo-backup-$(date +%Y%m%d)
git filter-repo --path .env --invert-paths
git push origin --force --all && git push origin --force --tags
確認します。
git log --all --full-history -- .env # empty
git log -p --all -S '<rotated-value>' # empty
両方の確認結果が空で、すべての共同作業者がクローンし直した時点で終了します。
緊急時の対応
認証情報がプッシュ済みのコミットに含まれている場合:
- 認証情報をローテーションします。これが完了するまでは、ほかの作業は完了とみなしません。
- プロバイダーのアクセスログを確認し、古い値が使用されていないか調べます。
cleanを実行して、履歴から削除します。guardゲートを通して強制プッシュします。- 共同作業者にクローンし直すよう伝えます。フォークとオープン中の PR には古い履歴が残ります。
preventを実行して、同じファイルが再びステージされないようにします。- 何が、いつ漏えいし、何をローテーションしたかを記録します。
関連項目
- 公開前の監査 — プライベートリポジトリを公開する前に一度だけ行う確認です。ライセンスと帰属表示、履歴全体にわたるシークレット、内部ホスト名と従業員に関する記述を確認します。公開の判断時に一度実行し、その後はコミットのたびに
git-safetyを実行します。 - アプリケーションセキュリティレビューでは脆弱性を確認しますが、Git の状態は確認しません。
機密ファイルのパターン全体、pre-commit フックスクリプトの完全版、.gitignore
テンプレート、git secrets の設定、BFG の代替手段、およびプラットフォームに関する注意事項:
references/full-guide.md