Переключение веток
polyrepo switch-default (алиас sd) — выбор репозиториев и переключение каждого на актуальную основную ветку.
polyrepo switch-default [options]Основная ветка определяется отдельно для каждого репозитория, а не предполагается заранее — сам GitHub по умолчанию называет основную ветку нового репозитория main, а многие переименовывают её (в том числе в master), так что в одной папке репозиториев вполне может быть часть на master, а часть на main. Определение сначала пробует локально закешированную ссылку origin/HEAD (без сети — её проставляет git clone), при её отсутствии — прямой read-only запрос к origin, затем — какая из веток master/main реально существует локально, и в последнюю очередь — main (дефолт самого GitHub), если ничего другое не подсказало.
- Показывает чекбокс-список всех репозиториев с их текущей веткой (и основной веткой, когда они различаются); репозитории, которые сейчас не на основной ветке, отмечены по умолчанию.
- После подтверждения — для каждого выбранного репозитория по одному: грязное рабочее дерево пропускается с предупреждением, нетронутым; иначе —
git fetch origin→git checkout <default branch>→git merge --ff-only origin/<default branch>. - Если локальная основная ветка разошлась с origin (fast-forward невозможен) — репозиторий помечается в отчёте и оставляется как есть, для ручного разрешения.
Опции
--packages <a,b,c>
Список пакетов вместо интерактивного чекбокса.
--yes
Пропустить подтверждение «proceed?».
--force
Меняет шаги 2 и 3 выше: грязное рабочее дерево больше не пропускается, и каждый репозиторий получает git checkout -f <default branch> + git reset --hard origin/<default branch> вместо безопасного fast-forward-only merge — незакоммиченные изменения отслеживаемых файлов и любые локальные коммиты на этой ветке безвозвратно отбрасываются. Неотслеживаемые файлы на этом этапе всё ещё не трогаются (это не git clean). Чекбокс помечает, у каких выбранных репозиториев будут потеряны изменения, а подтверждение показывает, у скольких именно, и по умолчанию отвечает «No» вместо «Yes», если --force реально что-то отбросит.
--clean
Вместе с --force дополнительно запускает git clean -fd — убирает неотслеживаемые файлы/директории, не попавшие в .gitignore (обычно это результат сборки, который забыли туда добавить). Пути, попадающие под .gitignore (например node_modules), по-прежнему не трогаются — -x намеренно не используется. Имеет смысл только вместе с --force — без него отбрасывать попросту нечего.
Реальный вывод — --force на репозитории с незакоммиченной правкой в package.json:
[1/1] vue-toast-kit
$ git fetch origin
$ git checkout -f master
Your branch is up to date with 'origin/master'.
Already on 'master'
$ git reset --hard origin/master
HEAD is now at 775ac80 init
✓ Discarded local changes — now on master, matching origin.Пример:
polyrepo switch-default
# отбросить локальные изменения в репозитории, который больше не нужен
polyrepo switch-default --packages vue-toast-kit --force
# то же самое, но заодно убрать неотслеживаемый результат сборки
polyrepo switch-default --packages vue-toast-kit --force --clean