Объединение нескольких 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.