Skip to content

Переключение веток

polyrepo switch-default (алиас sd) — выбор репозиториев и переключение каждого на актуальную основную ветку.

bash
polyrepo switch-default [options]

Основная ветка определяется отдельно для каждого репозитория, а не предполагается заранее — сам GitHub по умолчанию называет основную ветку нового репозитория main, а многие переименовывают её (в том числе в master), так что в одной папке репозиториев вполне может быть часть на master, а часть на main. Определение сначала пробует локально закешированную ссылку origin/HEAD (без сети — её проставляет git clone), при её отсутствии — прямой read-only запрос к origin, затем — какая из веток master/main реально существует локально, и в последнюю очередь — main (дефолт самого GitHub), если ничего другое не подсказало.

  1. Показывает чекбокс-список всех репозиториев с их текущей веткой (и основной веткой, когда они различаются); репозитории, которые сейчас не на основной ветке, отмечены по умолчанию.
  2. После подтверждения — для каждого выбранного репозитория по одному: грязное рабочее дерево пропускается с предупреждением, нетронутым; иначе — git fetch origingit checkout <default branch>git merge --ff-only origin/<default branch>.
  3. Если локальная основная ветка разошлась с 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.

Пример:

bash
polyrepo switch-default

# отбросить локальные изменения в репозитории, который больше не нужен
polyrepo switch-default --packages vue-toast-kit --force

# то же самое, но заодно убрать неотслеживаемый результат сборки
polyrepo switch-default --packages vue-toast-kit --force --clean