Объединение нескольких Git-репозиториев с тегами

Я работаю с несколькими различными репозиториями Git, которые нужно будет объединить. Рабочий процесс будет выглядеть так:

git remote add fork1 ...
git remote add fork2 ...
git fetch fork1
git fetch fork2
git merge fork1/master fork2/master

Это все хорошо, но я хотел бы иметь возможность получить конкретную фиксацию каждого пульта с помощью тегов:

git merge fork1/v1.0.0 fork2/v2.1.0

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

Проблема с тегами ссылок. Как описано в этом посте (не моем), все теги необъяснимым образом сбрасываются в глобальное пространство имен. Там нет никакого способа сказать fork1/v1.0.0 - это просто v1.0.0и если несколько репозиториев имеют одинаковый тег, они раздавливают друг друга.

После этого ответа я искал использование refspecs, чтобы обойти это. До сих пор я придумал следующее:

git fetch fork1 refs/tags/*:refs/tags/fork1/*

Это имеет намеренный эффект создания fork1 v1.0.0 тег прибыть как fork1/v1.0.0, К сожалению, это также прибывает как пространство имен v1.0.0; git fetch выводит вдвое больше строк в разделе отображения тегов, и git merge v1.0.0 все еще сливается с вытащенным тегом. Я не могу найти хорошую документацию по refspecs нигде ( документация Git по этой теме крайне бесполезна).

Как я могу предотвратить конфликт между тегами из нескольких репозиториев?

Я также открыт для других предложений рабочего процесса, если я просто сделаю это глупо. У меня есть одно ядро ​​репо с общими компонентами и структурой, а также несколько репозиториев модулей, которые являются полными клонами ядра, только с добавленным кодом. Мой текущий план состоит в том, чтобы каждый модуль имел удаленный указатель на ядро ​​(чтобы быть в курсе общих частей) и на каждый другой модуль, на который он опирается. Общие биты будут объединяться, потому что они одинаковы, а биты модуля будут объединяться, потому что они независимы. Есть ли другой шаблон, которому я должен следовать здесь? (Я избегал подмодулей, потому что (а) я никогда не слышал о них ничего хорошего, и (б) общая часть является верхним уровнем с точки зрения структуры каталогов проекта, что делает структуру репо крайне неудобной.)

1 ответ

Решение

Будет ли это работать, чтобы использовать --no-tags с:

git fetch fork1 refs/tags/*:refs/tags/fork1/* --no-tags

Это приведет к тому, что теги fork1 будут помещены в refs/tags/fork1, а также в теги refs/tags.

Другие вопросы по тегам