README
¶
git-update
git-update - небольшая CLI-утилита для массового обновления Git-репозиториев, которые лежат в одном общем каталоге.
Например, если у вас есть директория ~/projects, а внутри нее десятки репозиториев:
~/projects/
api/
frontend/
cli-tools/
experiments/
то git-update может пройти по всем непосредственным подкаталогам и выполнить для каждого нужные Git-действия: checkout, fetch, pull.
Утилита полезна, когда хочется быстро привести пачку локальных репозиториев к актуальному состоянию без ручного захода в каждый каталог.
Как Работает
Для каждого подкаталога внутри -dir программа:
- Проверяет состояние репозитория командой
git status --porcelain=v1. - Если есть незакоммиченные изменения, пропускает репозиторий.
- Если передан
-reset-hard, перед дальнейшими действиями выполняетgit reset --hard. - По выбранным флагам выполняет:
git checkout <branch>git fetch --prune --prune-tagsgit pull --ff-only
- Печатает лог обработки по каждому каталогу.
Обрабатываются только непосредственные подкаталоги указанной директории. Рекурсивного обхода вложенных папок нет.
Осторожно
Флаг -reset-hard удаляет локальные незакоммиченные изменения в репозитории. Используйте его только когда точно понимаете, что эти изменения не нужны.
git pull выполняется как git pull --ff-only. Это безопаснее для массового обновления: утилита не будет создавать merge commit. Если локальная ветка разошлась с удаленной, репозиторий будет отмечен ошибкой в логе.
Требования
- Go
1.26или новее для сборки из исходников. - Установленный
git. - macOS или Linux. Windows не является основной целевой платформой и отдельно не проверялась.
Установка Через Go Install
Если Go уже установлен, утилиту можно поставить напрямую из репозитория:
go install github.com/Format-C-eft/git-update/cmd/git-update@latest
После установки бинарный файл git-update появится в GOBIN, а если GOBIN не задан - в GOPATH/bin.
Путь включает /cmd/git-update, потому что исполняемый main-пакет находится в каталоге cmd/git-update.
Сборка
make build
После сборки бинарный файл будет доступен по пути:
./bin/git-update
Проверить версию:
./bin/git-update -version
Быстрый Старт
Обновить все репозитории в ~/projects: переключиться на master, выполнить fetch и затем pull --ff-only.
./bin/git-update -dir ~/projects -all
То же самое, но для ветки main:
./bin/git-update -dir ~/projects -branch main -all
Только получить изменения с удаленных репозиториев без переключения ветки и без pull:
./bin/git-update -dir ~/projects -fetch
Переключить все чистые репозитории на main:
./bin/git-update -dir ~/projects -branch main -checkout
Выполнить fast-forward pull для всех чистых репозиториев:
./bin/git-update -dir ~/projects -pull
Примеры
Полное Обновление Рабочей Папки
./bin/git-update \
-dir ~/projects \
-branch main \
-all
Эквивалентно набору действий:
git checkout main
git fetch --prune --prune-tags
git pull --ff-only
Аккуратное Обновление Без Сброса Изменений
./bin/git-update -dir ~/projects -branch main -all
Если в каком-то репозитории есть незакоммиченные изменения, он будет пропущен. Остальные репозитории продолжат обрабатываться.
Принудительный Сброс Локальных Изменений
./bin/git-update \
-dir ~/projects \
-branch main \
-all \
-reset-hard
Перед checkout, fetch и pull программа выполнит:
git reset --hard
Это удобно для одноразового обслуживания локальных копий, но опасно для рабочих репозиториев с незакоммиченными изменениями.
Ограничение Параллельности
По умолчанию одновременно обрабатывается до 4 репозиториев.
./bin/git-update -dir ~/projects -all -parallel 2
Это полезно, если репозиториев много или не хочется сильно нагружать сеть, диск и файловые дескрипторы.
Подробный Лог Команд
./bin/git-update -dir ~/projects -all -verbose
С -verbose в лог добавляется вывод выполненных Git-команд.
Флаги
| Флаг | По умолчанию | Описание |
|---|---|---|
-dir |
../ |
Каталог, внутри которого лежат репозитории. Обрабатываются только непосредственные подкаталоги. |
-branch |
master |
Ветка, на которую нужно переключаться при использовании -checkout или -all. Частые значения: master, main, develop. |
-all |
false |
Включает сразу -checkout, -fetch и -pull. |
-checkout |
false |
Выполнить git checkout <branch>. |
-fetch |
false |
Выполнить git fetch --prune --prune-tags. |
-pull |
false |
Выполнить git pull --ff-only. |
-reset-hard |
false |
Если в репозитории есть незакоммиченные изменения, выполнить git reset --hard и продолжить обработку. Без этого флага грязные репозитории пропускаются. |
-parallel |
4 |
Максимальное число репозиториев, которые обрабатываются одновременно. Значение должно быть больше 0. |
-execute_timeout |
30s |
Максимальное время обработки одного репозитория. Общий timeout рассчитывается как число_репозиториев * execute_timeout. |
-verbose |
false |
Добавлять в лог подробный вывод Git-команд. |
-version |
false |
Показать информацию о сборке и завершить работу. |
Минимально нужно указать хотя бы одно действие: -checkout, -fetch, -pull или -all. Если все действия выключены, программа завершится с ошибкой.
Логи И Коды Завершения
При успешной обработке программа завершается с кодом 0.
Если произошла ошибка верхнего уровня, например указан пустой путь или не выбрано ни одного действия, сообщение печатается в stderr, а программа завершается с кодом 1.
Ошибки отдельных репозиториев записываются в лог этого репозитория. Обработка остальных каталогов продолжается.
Пример фрагмента лога:
12:34:56.789: /Users/me/projects/api: start processing
12:34:56.900: /Users/me/projects/api: success: git fetch
12:34:57.100: /Users/me/projects/api: success: git pull --ff-only
12:34:57.101: /Users/me/projects/api: stop processing
--------------------------------------------------------------------
Разработка
Запустить тесты:
make test
Запустить линтер по изменениям относительно origin/master:
make lint
Запустить полный линтер по проекту:
make lint-full
Собрать бинарный файл:
make build