
Python CLI, который автоматически создаёт репозитории GitHub с безопасными настройками по умолчанию — защита веток, Dependabot, сканирование секретов и предварительное сканирование безопасности.
Создавайте репозитории GitHub с автоматически применяемыми безопасными настройками по умолчанию. Заменяет пятиминутную проверку настроек после создания одним единственным командованием.``` gh-safe-repo create <owner/repo>
Защита веток, неизменяемые теги, Dependabot, ограниченные разрешения Actions и сканирование секретов с защитой от push — всё настроено до того, как вы напишете первую строку кода.
> **Статус:** gh-safe-repo находится в активной разработке. Он хорошо работает для основного сценария — создания нового репозитория с безопасными настройками по умолчанию — но параметры CLI всё ещё дорабатываются, чтобы лучше соответствовать ожиданиям пользователей. Ожидайте ломающих изменений, пока не будут окончательно настроены релизы и CI/CD. ✌️
---
## Что вы получаете
Настройки GitHub по умолчанию оптимизированы для обнаруживаемости и гибкости, а не для безопасности: каждый новый репозиторий создаётся без защиты веток, без Dependabot и с Actions, которые имеют доступ на запись к репозиторию и могут одобрять собственные pull request'ы.
`gh-safe-repo` исправляет всё это одним махом, сначала показывая вам план:
- **Приватность по умолчанию** — передайте `--public`, когда хотите, чтобы его увидел весь мир
- **Защита веток** — требуется PR, 1 одобряющий отзыв, устаревшие отзывы отклоняются, обсуждения разрешены, без force push, без удаления веток
- **Неизменяемые теги** — теги релизов нельзя перезаписать или удалить
- **Actions заблокированы** — токен только для чтения, без самоодобряющих PR, actions, закреплённые по SHA, только издатели, принадлежащие GitHub и верифицированные
- **Dependabot включён** — оповещения об уязвимостях плюс автоматические PR с исправлениями
- **Сканирование секретов с защитой от push** — коммиты, содержащие поддерживаемые секреты, блокируются
- **Приватное сообщение об уязвимостях** — исследователи могут связаться с вами, не предавая огласке
- **Предварительное сканирование секретов** — при push существующего кода (`--local` / `--from`) ваше рабочее дерево и история git сканируются локально, прежде чем что-либо попадёт на GitHub
- **Дополнительные опции по желанию** — wiki, projects и issues не трогаются, если вы не попросите управлять ими (`has_wiki = false` в конфигурации)
Всё настраивается. Смотрите [Безопасные настройки по умолчанию полностью](#safe-defaults-in-full) для точных параметров и [Конфигурация](#configuration) для того, как их изменить.
## Требования
- **Python 3.10+**
- **[`gh` CLI](https://cli.github.com/)** с аутентификацией (`gh auth login`), **или** `GITHUB_TOKEN`, заданный в вашем окружении
- **[`uv`](https://docs.astral.sh/uv/)** для установки из исходников
- **truffleHog v3** *(опционально)* — используется предварительным сканером; автоматически определяется из PATH или запускается через podman/docker, с regex-фолбэком, если ни того, ни другого нет
Для push кода с `--local` или `--from` дополнительно нужны ваши обычные учётные данные git для GitHub — смотрите [Работа с локальным или существующим кодом](#working-from-local-or-existing-code).
## Установка```bash
git clone https://github.com/AriESQ/gh-safe-repo
cd gh-safe-repo
uv tool install .
gh-safe-repo --help
Это устанавливает gh-safe-repo в среду инструментов uv и добавляет его в ваш PATH.
Чтобы запустить его без установки:```bash uv sync # creates .venv ./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 пропускает его):```bash
gh-safe-repo create AriESQ/demo-repo
**3. Начните работу.** В случае успеха вы получите URL репозитория и готовые к вставке команды для удалённого доступа:```
╭─ 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
Обычный `create` инициализирует репозиторий, чтобы существовала ветка по умолчанию (для защиты ветки она нужна), затем удаляет автоматически созданный `README.md`, чтобы вы начали с чистого листа. Установите `auto_init = true` в конфигурации, чтобы сохранить его.
### Отправка существующего локального проекта```bash
gh-safe-repo create <owner/repo> --local ~/projects/myapp
Сначала сканирует каталог на наличие секретов, создаёт репозиторий, отправляет все ветки и теги, затем настраивает origin и отслеживание upstream в вашем исходном каталоге, чтобы git push работал сразу. Существующий origin, указывающий на другое место, остаётся нетронутым; предупреждение и баннер об успехе сообщают точную команду git push -u origin <branch>:<branch>, которую нужно выполнить вместо этого. См. Работа с локальным или существующим кодом.