Автоматизация 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
Скрипт выполняет следующие шаги:
-
Проверка репозитория
- Проверка, что директория является Git-репозиторием
- Проверка наличия remote
- Проверка доступа к GitHub
- Проверка чистоты репозитория (незакоммиченные изменения в чувствительных файлах)
-
Синхронизация с remote
- Git fetch
- Git pull --rebase (для избежания merge commits)
-
Анализ изменений
- Определение измененных, новых, удаленных файлов
- Анализ diff для определения типа изменений (включая контент изменений)
-
Проверка существующего workflow (идемпотентность)
- Если на feature-ветке с существующим PR — продолжить работу
- Проверка CI статуса перед коммитом
- Если на основной ветке — создать новый workflow
-
Генерация названия ветки
- Автоматическая генерация на основе анализа изменений
- Следование Git Flow конвенции (до 40 символов)
- Формат:
тип/описание(например,feat/catalog-search)
-
Создание ветки
- Создание новой ветки
- Переключение на нее
-
Индексация и коммит
- Добавление изменений в индекс
- Создание коммита с Conventional Commits сообщением (на английском)
-
Push изменений
- Push ветки в remote
- Установка upstream
-
Создание Pull Request (опционально)
- Запрос подтверждения у пользователя
- Автоматическое создание PR с описанием изменений
- Или
--create-prдля автоматического создания
-
Завершение
- Скрипт завершает работу после 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 и используется внутри организации.
Поддержка
При возникновении проблем:
- Проверьте логи (используйте
--verboseи--log-dir) - Убедитесь, что GitHub CLI установлен и авторизован
- Проверьте доступ к репозиторию GitHub
- Используйте
--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
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file gitaut-1.0.2.tar.gz.
File metadata
- Download URL: gitaut-1.0.2.tar.gz
- Upload date:
- Size: 55.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c7d883767414e3ad866028a80aede1e6fda0466d0cf8c7c2a6673084b2acf6cb
|
|
| MD5 |
bf01c027dbd455255d9f8420543bdbc3
|
|
| BLAKE2b-256 |
17601035eb55b2f1484eb1ef9e7db59bca6cdfcd48ff1d3e573c581904013773
|
File details
Details for the file gitaut-1.0.2-py3-none-any.whl.
File metadata
- Download URL: gitaut-1.0.2-py3-none-any.whl
- Upload date:
- Size: 59.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.10
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0374df0b74e056866a24db9056c35922bf1b41bd1eb86d1be50e560c50cf3063
|
|
| MD5 |
19ef61c93c28aa75ac99f30670137596
|
|
| BLAKE2b-256 |
cf0f626d8e7abf6cc3a9c2b4afa2944d5cd438fb1ca01b5318219c01fb3df3cf
|