git-update

module
v0.1.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 27, 2026 License: MIT

README

git-update

git-update - небольшая CLI-утилита для массового обновления Git-репозиториев, которые лежат в одном общем каталоге.

Например, если у вас есть директория ~/projects, а внутри нее десятки репозиториев:

~/projects/
  api/
  frontend/
  cli-tools/
  experiments/

то git-update может пройти по всем непосредственным подкаталогам и выполнить для каждого нужные Git-действия: checkout, fetch, pull.

Утилита полезна, когда хочется быстро привести пачку локальных репозиториев к актуальному состоянию без ручного захода в каждый каталог.

Как Работает

Для каждого подкаталога внутри -dir программа:

  1. Проверяет состояние репозитория командой git status --porcelain=v1.
  2. Если есть незакоммиченные изменения, пропускает репозиторий.
  3. Если передан -reset-hard, перед дальнейшими действиями выполняет git reset --hard.
  4. По выбранным флагам выполняет:
    • git checkout <branch>
    • git fetch --prune --prune-tags
    • git pull --ff-only
  5. Печатает лог обработки по каждому каталогу.

Обрабатываются только непосредственные подкаталоги указанной директории. Рекурсивного обхода вложенных папок нет.

Осторожно

Флаг -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

Directories

Path Synopsis
cmd
git-update command
internal
cmd

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL