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+

Установка

Вариант 1 (pip / pipx)

1. Устанавка виртуального окружения под вашу OS

пример: python3 -m venv .venv

2. Активация виртуального окружеения под вашу OS

пример: source .venv/bin/activate

3. Установка пакета gitaut

В активированном ввиртуальном окружении вашего проекта выполните команду устанноввки пакета:

pip install gitaut или pipx install gitaut

Варииант 2 (git clone)

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.4.tar.gz (57.4 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.4-py3-none-any.whl (61.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: gitaut-1.0.4.tar.gz
  • Upload date:
  • Size: 57.4 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.4.tar.gz
Algorithm Hash digest
SHA256 7b640348840a05b557e9e117e87ac5a611983756e85685f23d8c676a4f82daed
MD5 8e409bd1e8a57eabb16e2c23b6aef89e
BLAKE2b-256 ddb16d3bf464725a4b09c0db91c3acc900dc1b8207fac40c5c42263be5d8eea1

See more details on using hashes here.

File details

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

File metadata

  • Download URL: gitaut-1.0.4-py3-none-any.whl
  • Upload date:
  • Size: 61.7 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.4-py3-none-any.whl
Algorithm Hash digest
SHA256 30f1181103f7a0c870c53a5737de8589bfbb7a718f6e742955dc07292b3c4992
MD5 b10ef07919580f6e3e738818c121a16b
BLAKE2b-256 aa00a7517722df0811c1df2ca06ce4e150711b4b3addffce226670dffaf33ac9

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