
安全なデフォルト設定を適用したGitHubリポジトリを、1つのコマンドで作成します。
gh-safe-repo create <owner/repo>
ブランチ保護、イミュータブルタグ、Actionsのロックダウン、Dependabot、プッシュ保護付きシークレットスキャン、プライベート脆弱性報告はすべて、最初のコミットをプッシュする前に設定されます。同じツールが既存のリポジトリを監査・修正し、コードがマシンから出る前にローカルでシークレットをスキャンします。
ステータス: コアワークフローは安定しており、エンドツーエンドで検証済みですが、 CLIはまだ磨き上げの途中です。1.0より前に破壊的変更が発生する可能性があります。
--local と --fromGitHubのデフォルトは安全性よりも発見しやすさを優先しています。新しいリポジトリにはブランチ保護もDependabotもなく、Actionsはリポジトリへの書き込みや自身のプルリクエストの承認が可能です。gh-safe-repo はこれを変え、何かに触れる前にプランを表示します:
--public を渡します。すべての設定は構成可能です。正確な値については安全なデフォルトを、変更方法については設定を参照してください。
要件:
gh CLI(gh auth login)、または環境変数に設定された GITHUB_TOKENuvPATH 上で見つかるか、podman/docker経由で実行されます。どちらもない場合は正規表現スキャナーが使用されます。--local または --from でコードをプッシュするには、GitHub用の通常のgit認証情報も必要です。コードのプッシュを参照してください。
git clone https://github.com/AriESQ/gh-safe-repo
cd gh-safe-repo
uv tool install .
gh-safe-repo --help
インストールせずに実行するには:
uv sync
./gh-safe-repo create <owner/repo>
1. プレビュー。 --dry-run は API 呼び出しを行わず、何も作成しません。
$ gh-safe-repo create AriESQ/demo-repo --dry-run
Configuring AriESQ/demo-repo...
Planned Changes
Type Category Setting Value / Note
------ ----------------- -------------------------------------- ----------------------------------------------------------------
ADD repo repository AriESQ/demo-repo
DELETE file readme README.md
UPDATE actions allowed_actions 'all' → 'selected'
UPDATE actions verified_allowed False → True
UPDATE actions sha_pinning_required False → True
UPDATE actions default_workflow_permissions 'write' → 'read'
UPDATE actions can_approve_pull_request_reviews True → False
SKIP branch_protection branch_protection Branch protection requires a public repo or paid GitHub plan
SKIP security dependabot_alerts Requires a public repo or paid GitHub plan
SKIP security secret_scanning Requires a public repo or paid GitHub plan
SKIP security dependabot_security_updates Requires a public repo or paid GitHub plan
SKIP security private_vulnerability_reporting Requires a public repo or paid GitHub plan
SKIP security enable_dependency_graph Requires a public repo or paid GitHub plan
SKIP security enable_secret_scanning_push_protection Requires a public repo or paid GitHub plan
SKIP tag_protection tag_protection Tag protection rulesets require a public repo or paid GitHub plan
7 change(s) to apply, 8 skipped
Dry run — no changes made.
SKIP の行は、無料プランでプライベートリポジトリを使用した場合の状態を示しています。これらの機能には公開リポジトリまたは有料プランが必要であり、ツールは黙って失敗するのではなく、その旨を表示します。詳しくは GitHub プランの制限 を参照してください。
2. 適用。 --dry-run を外します。同じプランが表示された後、確認プロンプトが表示されます(--yes でスキップできます)。
gh-safe-repo create AriESQ/demo-repo
3. 作業を開始します。 成功すると、Verified セクション(すべての設定が GitHub から読み戻されたもの)と、すぐに貼り付け可能なコマンドを含むバナーが表示されます:
╭─ Done ───────────────────────────────────────────────────╮
│ Repository created successfully! │
│ https://github.com/AriESQ/demo-repo │
│ │
│ Add remote to existing repo: │
│ SSH : git remote add origin [email protected]:AriESQ/… │
│ HTTPS: git remote add origin https://github.com/… │
│ │
│ Clone fresh: │
│ SSH : git clone [email protected]:AriESQ/demo-repo.git │
│ HTTPS: git clone https://github.com/AriESQ/demo-… │
╰──────────────────────────────────────────────────────────╯
お好みのプロトコル(gh config get -h github.com git_protocol)が
最初に表示されます。
gh-safe-repo create <owner/repo> # private (default)
gh-safe-repo create <owner/repo> --public # public: branch and tag protection apply
リポジトリはデフォルトブランチが存在するように初期化され(ブランチ保護には
これが必要)、その後、クリーンな状態から始められるように自動生成された README.md が削除されます。これを保持したい場合は、設定で
auto_init = true を指定してください。オーナーは認証済みアカウントと一致している必要があり、これにより
マルチアカウント環境での誤操作を防ぎます。
gh-safe-repo create <owner/repo> --local ~/projects/myapp
ディレクトリ内のシークレットをスキャンし、リポジトリを作成して、すべてのブランチとタグをプッシュした後、元のディレクトリに origin と上流トラッキングを設定するので、git push がすぐに機能します。すでに別の場所を指している origin はそのまま残され、代わりに実行すべきコマンドがバナーで通知されます。その後、プッシュされたすべてのブランチとタグが GitHub の SHA と SHA 単位で照合されます。詳細はコードのプッシュを参照してください。
gh-safe-repo create <owner/repo> --from <owner/source>
gh-safe-repo create <owner/pub> --from <owner/priv> --public # scanned thoroughly first
ソースを完全な履歴とともにクローンし、スキャンし、新しいリポジトリにミラーリングし、ソースのデフォルトブランチ、説明、トピックをコピーします。スキャン時に中止した場合、コードはGitHubに到達しません。
gh-safe-repo fix <owner/repo> --dry-run # what is out of compliance?
gh-safe-repo fix <owner/repo> # apply the missing defaults
gh-safe-repo fix <owner/repo> --yes # no prompt, for scripts
fix は各設定を読み取り、差分があるものには UPDATE、すでに正しいものには SKIP を表示し、実際の変更に対してのみ API を呼び出します。これは設定専用です(シークレットスキャンは行いません)。リポジトリの管理者権限が必要で、そのリポジトリは org または別のアカウントが所有している場合があります。
gh-safe-repo scan .
gh-safe-repo scan . && git push # exit 1 on critical findings
ローカルのみ。GitHubには何も送信されません。プリフライトスキャナーを参照してください。
gh-safe-repo [--config PATH] [--debug] create <owner/repo> [OPTIONS]
gh-safe-repo [--config PATH] [--debug] fix <owner/repo> [OPTIONS]
gh-safe-repo [--config PATH] [--debug] scan <path> [OPTIONS]
--config と --debug はグローバルオプションであり、コマンドの前後どちらに置いてもかまいません。
2 回指定した場合は後から指定したものが優先されます。その他のオプションはコマンドの後に置く必要があります。
--config は省略可能な値を受け取るため、値なしの --config は最後に置く必要があります:
gh-safe-repo --config scan ./src とすると、scan がパスとして解釈されてしまいます。
GitHub を対象とするすべてのコマンドは owner/repo を受け取ります(例: myuser/my-repo)。
グローバルオプション
| オプション | 説明 |
|---|---|
--config [PATH] | 使用する設定ファイル。値なしの --config は組み込みのデフォルトのみを使用 |
--debug | すべての API 呼び出しとレスポンスを出力。fix の場合は解決されたリポジトリの識別情報(id、フルネーム、オーナータイプ)も出力 |
create <owner/repo>