Skip to main content

Автоматизация Git workflow: создание ветки, коммит, push, PR и мониторинг

Project description

Git Automation Script

Production-ready скрипт автоматизации работы с Git и GitHub, который упрощает процесс подготовки изменений к ревью.

Возможности

  • Автоматический анализ изменений: Определяет тип изменений (feat, fix, refactor, chore, docs и т.д.)
  • Генерация названия ветки: Создает осмысленные названия веток по Git Flow конвенции (до 40 символов)
  • Conventional Commits: Автоматическая генерация сообщений коммитов по стандарту (на английском)
  • Создание Pull Request: Опциональное создание PR с описанием изменений
  • Проверка CI статуса: Проверка CI/CD перед коммитом на существующей ветке
  • Идемпотентность: Возможность повторного запуска на существующей ветке
  • Dry-run режим: Предпросмотр действий без выполнения
  • Интерактивный режим: Подтверждение действий пользователем
  • Подробное логирование: Полное логирование всех операций
  • Проверка чистоты репозитория: Проверка незакоммиченных изменений в чувствительных файлах
  • Синхронизация с remote: Автоматический fetch и pull --rebase перед созданием ветки
  • Автоматическое удаление веток: Через GitHub Action после мержа

Требования

  • Python 3.8+
  • Git
  • GitHub CLI (gh)
  • Доступ к GitHub репозиторию

Установка

1. Клонирование или установка скрипта

Скрипт находится в директории scripts/git-automation/.

2. Установка GitHub CLI

macOS:

brew install gh

Linux:

curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
sudo apt update
sudo apt install gh

Windows: Скачайте установщик с https://cli.github.com/

3. Авторизация в GitHub

gh auth login

Следуйте инструкциям для авторизации.

4. Зависимости Python

Скрипт использует только стандартную библиотеку Python. Дополнительные зависимости не требуются.

Использование

Базовый запуск

Автоматический режим без подтверждений:

cd /path/to/your/repository
python /path/to/scripts/git-automation/main.py

Dry-run режим

Показать действия без выполнения:

python /path/to/scripts/git-automation/main.py --dry-run

Интерактивный режим

С подтверждениями перед каждым действием:

python /path/to/scripts/git-automation/main.py --interactive

Кастомное название ветки

python /path/to/scripts/git-automation/main.py --branch-name feat/my-custom-feature

Кастомное сообщение коммита

python /path/to/scripts/git-automation/main.py --commit-message "feat: add new feature"

Автоматическое создание PR

python /path/to/scripts/git-automation/main.py --create-pr

Amend последнего коммита

python /path/to/scripts/git-automation/main.py --amend

Cleanup после мержа

python /path/to/scripts/git-automation/cleanup.py

Подробное логирование

python /path/to/scripts/git-automation/main.py --verbose

Сохранение логов в файл

python /path/to/scripts/git-automation/main.py --log-dir ./logs

Workflow

Скрипт выполняет следующие шаги:

  1. Проверка репозитория

    • Проверка, что директория является Git-репозиторием
    • Проверка наличия remote
    • Проверка доступа к GitHub
    • Проверка чистоты репозитория (незакоммиченные изменения в чувствительных файлах)
  2. Синхронизация с remote

    • Git fetch
    • Git pull --rebase (для избежания merge commits)
  3. Анализ изменений

    • Определение измененных, новых, удаленных файлов
    • Анализ diff для определения типа изменений (включая контент изменений)
  4. Проверка существующего workflow (идемпотентность)

    • Если на feature-ветке с существующим PR — продолжить работу
    • Проверка CI статуса перед коммитом
    • Если на основной ветке — создать новый workflow
  5. Генерация названия ветки

    • Автоматическая генерация на основе анализа изменений
    • Следование Git Flow конвенции (до 40 символов)
    • Формат: тип/описание (например, feat/catalog-search)
  6. Создание ветки

    • Создание новой ветки
    • Переключение на нее
  7. Индексация и коммит

    • Добавление изменений в индекс
    • Создание коммита с Conventional Commits сообщением (на английском)
  8. Push изменений

    • Push ветки в remote
    • Установка upstream
  9. Создание Pull Request (опционально)

    • Запрос подтверждения у пользователя
    • Автоматическое создание PR с описанием изменений
    • Или --create-pr для автоматического создания
  10. Завершение

    • Скрипт завершает работу после push
    • GitHub Action автоматически удаляет ветку после мержа

Обработка ошибок

Скрипт обрабатывает следующие ситуации:

  • Текущая папка не является Git-репозиторием
  • Отсутствует remote или origin
  • GitHub CLI не установлен
  • Пользователь не авторизован в GitHub
  • Отсутствует доступ к репозиторию
  • Ошибки сети
  • Merge-конфликты
  • Незавершенные операции Git (merge, rebase, cherry-pick)
  • Отсутствие изменений для коммита
  • Ошибки при push
  • Невозможность удалить ветку
  • Невозможность переключиться на основную ветку

Во всех случаях выводятся понятные сообщения с рекомендациями по устранению.

Автоматическое удаление веток

Для автоматического удаления веток после мержа используется GitHub Action .github/workflows/cleanup-branches.yml.

Этот Action:

  • Запускается при закрытии Pull Request
  • Проверяет, что PR был объединен (merged)
  • Удаляет соответствующую ветку в remote
  • Не требует запущенного скрипта или фоновых процессов

Статусы Pull Request

Open

PR открыт. Разработчик может продолжать добавлять коммиты и выполнять push. Скрипт проверяет CI статус перед новым коммитом.

Merged

PR успешно объединен. GitHub Action автоматически удаляет ветку в remote.

Closed

PR закрыт без мержа. Ветка не удаляется автоматически. Разработчик может:

  • Оставить ветку для дальнейшей работы
  • Удалить локальную ветку вручную
  • Удалить локальную и удаленную ветки вручную

Архитектура

Скрипт построен по принципам SOLID и Clean Code:

git-automation/
├── src/
│   ├── __init__.py           # Пакет
│   ├── logger.py             # Централизованное логирование
│   ├── error_handler.py      # Обработка ошибок
│   ├── git_operations.py     # Операции Git
│   ├── github_client.py      # GitHub CLI wrapper
│   ├── change_analyzer.py   # Анализ изменений
│   ├── branch_namer.py       # Генерация названий веток
│   ├── commit_generator.py   # Генерация сообщений коммитов
│   ├── pr_monitor.py         # Мониторинг PR
│   └── orchestrator.py       # Координация workflow
├── config/
│   └── default_config.yaml   # Конфигурация
├── main.py                   # Точка входа
└── README.md                 # Документация

Конфигурация

Конфигурация находится в config/default_config.yaml:

github:
  pr_poll_interval: 60  # Интервал опроса PR (секунды)
  draft_prs: false      # Создавать черновики PR

git:
  main_branches:        # Основные ветки для обнаружения
    - main
    - master
    - develop

branch_naming:
  max_length: 100       # Максимальная длина названия ветки
  reserved_names:       # Зарезервированные названия
    - head
    - main
    - master
    - develop

commit:
  max_description_length: 50  # Макс. длина описания
  language: ru               # Язык сообщений

logging:
  level: INFO          # Уровень логирования
  format: "..."        # Формат логов

Примеры

Пример 1: Добавление новой функции

# Вносим изменения
echo "print('Hello')" > new_feature.py

# Запускаем скрипт
python /path/to/scripts/git-automation/main.py

# Результат:
# - Ветка: feat/add-feature
# - Коммит: feat: add feature
# - Запрос на создание PR

Пример 2: Исправление ошибки

# Вносим исправление
sed -i 's/bug/fix' file.py

# Запускаем скрипт
python /path/to/scripts/git-automation/main.py

# Результат:
# - Ветка: fix/file-fix
# - Коммит: fix: fix bug
# - Запрос на создание PR

Пример 3: Продолжение работы на существующей ветке

# На ветке feat/add-feature с открытым PR
# Вносим дополнительные изменения
echo "more code" >> file.py

# Запускаем скрипт
python /path/to/scripts/git-automation/main.py

# Результат:
# - Новая ветка не создается
# - Проверка CI статуса
# - Изменения коммитятся в существующую ветку
# - Push выполняется

Troubleshooting

GitHub CLI не найден

Ошибка: GitHub CLI (gh) не установлен.
Решение: brew install gh (macOS) или скачайте с https://cli.github.com/

Не авторизован в GitHub

Ошибка: Вы не авторизованы в GitHub.
Решение: gh auth login

Нет изменений

Ошибка: Нет изменений для коммита.
Решение: Внесите изменения в файлы перед запуском скрипта.

Merge конфликты

Ошибка: Обнаружены merge-конфликты.
Решение: Разрешите конфликты вручную: git status

Безопасность

  • Dry-run режим: Всегда используйте --dry-run перед первым запуском
  • Интерактивный режим: Используйте --interactive для подтверждения действий
  • Логирование: Все действия логируются для аудита
  • Безопасное удаление: Ветки не удаляются при закрытии PR без мержа

Лицензия

Скрипт является частью проекта Hyperline и используется внутри организации.

Поддержка

При возникновении проблем:

  1. Проверьте логи (используйте --verbose и --log-dir)
  2. Убедитесь, что GitHub CLI установлен и авторизован
  3. Проверьте доступ к репозиторию GitHub
  4. Используйте --dry-run для диагностики

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gitaut-1.0.3.tar.gz (56.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

gitaut-1.0.3-py3-none-any.whl (61.1 kB view details)

Uploaded Python 3

File details

Details for the file gitaut-1.0.3.tar.gz.

File metadata

  • Download URL: gitaut-1.0.3.tar.gz
  • Upload date:
  • Size: 56.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for gitaut-1.0.3.tar.gz
Algorithm Hash digest
SHA256 eadf3ff4473d8f7ed63248ff9c71fd2504936a37352e57e80aaac8793f304eaf
MD5 98588688c1079f55bfd918245376241d
BLAKE2b-256 f8803bb0d3674ef558c79d5a8075d084ab51d9d0531fff0ec3fd1767f4ae9394

See more details on using hashes here.

File details

Details for the file gitaut-1.0.3-py3-none-any.whl.

File metadata

  • Download URL: gitaut-1.0.3-py3-none-any.whl
  • Upload date:
  • Size: 61.1 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.10

File hashes

Hashes for gitaut-1.0.3-py3-none-any.whl
Algorithm Hash digest
SHA256 a547358365a2cf24bb150d45da69a8d69b43578bd09b676405dde43554b124b9
MD5 eaef5e504ac053b9795a3a87ee2a5f25
BLAKE2b-256 2684ce1f9e1d8f718179e0473cc710f55d5a2174e89edeed9b804e7906dda0da

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page