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 уже установлен, утилиту можно поставить напрямую из репозитория:
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