Гайд · TNWS AI

Как запретить git push в Copilot CLI через --deny-tool

6 мин

Точная политика Copilot CLI: разрешить команды git, но запретить git push через allow/deny patterns и проверить приоритет запрета.

Задача и когда применять

Практическая задача этого руководства — разрешить Copilot CLI выполнять локальные Git-команды, но гарантированно оставить git push за ручным действием пользователя. Материал рассчитан на разработчика или администратора, который уже установил GitHub Copilot CLI и хочет получить проверяемый результат, а не просто скопировать команду из справки.

Команды CLI исполняются в контексте текущего пользователя, рабочего каталога и активной политики организации. Перед началом сохраните вывод copilot version, pwd и git status --short, если работаете в репозитории. Не вставляйте в prompt, аргументы и диагностические файлы токены, закрытые ключи или содержимое .env.

Что подтверждено официально

Проверено 13 сентября 2026 года. Официальный пример использует copilot --allow-tool='shell(git:*)' --deny-tool='shell(git push)'. Суффикс :* совпадает со stem и пробелом: охватывает git push и git pull, но не gitea. Deny всегда имеет приоритет над allow, даже при --allow-all.

Первоисточник — GitHub Copilot CLI command reference. Для MCP-сценария дополнительно используйте официальную настройку MCP servers. Цены, квоты и список доступных моделей здесь не приводятся: они не нужны для процедуры и могут меняться. Названия команд и параметров взяты из текущей официальной справки.

У CLI есть три разных уровня результата: команда может быть синтаксически принята, фактически выполнена и дать ожидаемый эффект. Проверяйте все три. Нулевой exit code без проверки файла или интерфейса недостаточен; красивый текст ответа при ненулевом exit code тоже нельзя считать успехом.

Перед тестом запишите точную гипотезу в одном предложении: «после команды появится такой-то файл, источник, запрет или набор подсказок». Затем определите независимый способ проверки, который не опирается на объяснение самого ассистента. Для файла это просмотр содержимого и diff, для разрешения — намеренно безопасная попытка запрещённого действия, для списка — сравнение структурированного вывода. Такой подход помогает обнаружить ситуацию, когда команда отработала, но не в том каталоге, не для того пользователя или не в той конфигурации.

Подготовка безопасной среды

Для первого запуска используйте тестовый репозиторий, временный каталог или read-only задачу. Сохраните baseline: существующие файлы конфигурации, список источников, текущий completion или разрешения. Если команда пишет файл, заранее определите точный путь и сделайте резервную копию только этого файла. Если команда предоставляет доступ, перечислите разрешённые и контрольные запрещённые объекты.

Не используйте глобальные разрешения ради удобства, когда задачу решает точный флаг. В CI разделяйте stdout, stderr и exit code. В интерактивной сессии читайте запросы разрешений и не подтверждайте действие только потому, что его предложил Copilot. Любой сгенерированный код или конфигурацию просматривайте как обычный внешний patch.

Пошаговые действия

  1. Создайте тестовый локальный репозиторий без production remote либо используйте безопасную ветку.
  2. Запустите CLI с точным allow для shell(git:*) и deny для shell(git push).
  3. Попросите выполнить git status; команда должна соответствовать разрешённому git stem.
  4. Попросите подготовить локальный commit только если это безопасно и ожидаемо.
  5. Попросите выполнить git push как негативный тест: CLI не должен получить разрешение на эту команду.
  6. Проверьте, что запрет не заменён общим --allow-all: deny всё равно должен выигрывать.
  7. Не используйте более широкое shell без аргумента, если нужны только Git-команды.
  8. Зафиксируйте строку запуска в wrapper script без токенов и проверяйте её при обновлении CLI.

После выполнения повторите диагностическую команду или откройте новую shell/CLI-сессию, если эффект должен пережить перезапуск. Сравните результат с baseline. Если изменилось больше файлов или источников, чем ожидалось, остановитесь, сохраните diff и выполните откат до продолжения.

Готовый шаблон для копирования

Заполните эту карточку перед изменением. Её можно вставить в issue или change request:

Политика Git для Copilot CLI
Allow: shell(git:*)
Deny: shell(git push)
Позитивный тест: git status
Негативный тест: git push
Remote тестового repo: <none/test>
Ожидание: status выполняется, push запрещён
Ответственный за ручной push: <роль>
Дата проверки документации: 13.09.2026
Официальный источник: https://docs.github.com/en/copilot/reference/copilot-cli-reference/cli-command-reference

Для подготовки проверки можно скопировать prompt ниже. Он не разрешает ассистенту придумывать состояние окружения:

Составь план безопасной проверки команды GitHub Copilot CLI по карточке ниже.
Не выполняй запись, сетевую публикацию и изменение прав.
Не придумывай версию, файлы, exit code или успешный результат.
Верни: предпосылки, точную команду, позитивный тест, негативный тест,
наблюдаемые критерии успеха, откат и данные, которые нельзя логировать.

<вставьте заполненную карточку>

Реалистичный пример

Входные условия. Агент должен читать status и создавать локальный commit в тестовом repo, но публикация ветки требует человека.

Ожидаемый результат. git status попадает под allow pattern. git push попадает и под общий allow, и под точный deny, но запрет имеет приоритет, поэтому автоматическое выполнение блокируется.

Пример считается успешным только после наблюдаемой проверки: существования и содержимого файла, нового completion в отдельной сессии, записи JSON, списка источников либо явного запрета действия. Не подменяйте ожидаемый результат пересказом документации — зафиксируйте фактический вывод вашей среды.

Позитивный и негативный тест

В позитивном тесте используйте минимальный безопасный объект: одну известную подкоманду, один каталог, один источник или один JSONL-файл. Сначала предскажите наблюдаемый результат, затем запустите действие и сохраните exit code. Если вывод содержит внутренние пути, не публикуйте сырой лог.

Негативный тест должен менять ровно одно условие: запретить конкретную команду, выбрать файл вне scope, убрать сессионный флаг или открыть новый shell. Такой тест доказывает границу настройки. Не используйте production remote, реальные секреты и необратимые операции для демонстрации отказа.

Если позитивный тест не прошёл, проверьте working directory, кавычки shell, версию CLI, организационную policy и права на целевой путь. Если негативный тест неожиданно прошёл, считайте конфигурацию небезопасной, завершите сессию и сузьте разрешения.

Типичные ошибки

  • Разрешать весь shell вместо git stem.
  • Забывать кавычки вокруг pattern.
  • Проверять push на production remote.
  • Предполагать, что --allow-all отменяет deny.
  • Путать git:* с простым текстовым prefix для gitea.

Отдельная ошибка — копировать команду между Bash, Zsh, Fish, PowerShell и CI без адаптации кавычек и перенаправлений. Сначала определите shell. Не сохраняйте секретные аргументы в history; используйте поддерживаемые переменные окружения или защищённое хранилище конкретной CI-системы.

Чек-лист финальной проверки

  • copilot version и рабочий каталог записаны.
  • Команда и названия флагов сверены с официальной документацией на 13.09.2026.
  • В prompt, history и временных файлах нет секретов.
  • Baseline сохранён до изменения.
  • Позитивный тест дал заранее описанный наблюдаемый результат.
  • Негативный тест подтвердил границу настройки.
  • Проверены exit code, stdout и stderr, где это применимо.
  • Неожиданные изменения файлов отсутствуют либо разобраны.
  • Временные логи и конфигурации удалены или защищены.
  • Откат выполнен на тесте или подробно записан.

FAQ

Почему нужен :*?

Он совпадает со stem команды и следующим пробелом, избегая частичных совпадений вроде gitea.

Что важнее: allow или deny?

Deny всегда имеет приоритет.

Работает ли deny при --allow-all?

Да, это прямо указано в официальной справке.

Как тестировать безопасно?

Используйте репозиторий без production remote и проверяйте отказ до реальной публикации.

Итог

Рабочая настройка — это команда плюс доказательство её эффекта и границы. Храните заполненную карточку рядом с issue, а повторяемую команду — в проверенном wrapper script без секретов. Перед переносом в другую машину или организацию снова проверьте официальную справку: CLI обновляется, а доступность функций может зависеть от политики владельца Copilot.

Читайте также

Комментарии

Пока тихо. Скажите первое слово