#git
#git
Вопрос:
Допустим, у меня есть три репозитория, child
, parent
и grandparent
. parent
имеет подмодуль child
и grandparent
имеет два подмодуля parent
и child
.
Чего я хочу добиться, так это того, что parent
проверка выполняется (или инициализация и обновление) child
только тогда, когда parent
само по себе является автономным репозиторием (а не подмодулем другого репозитория). И когда parent
это подмодуль of grandparent
, он не будет проверять свой собственный child
, но будет использовать child
предоставленный by grandparent
. Причина, по которой я это делаю, заключается в том, что child
и parent
являются большими базовыми репозиториями, и grandparent
являются листовыми. Итак, существует много разных grandparent
репозиториев, каждый из которых имеет свой подмодуль, указывающий на разные коммиты в child
и parent
. И поскольку child
он большой, я не хочу хранить еще одну его копию parent
. Если быть более точным, child
это репозиторий активов, содержащий все виды данных и активов. parent
является анализатором данных. И grandparent
является ли приложение, использующее анализатор для доступа к ресурсам. Поскольку разные приложения имеют несколько разный прогресс в принятии изменений, внесенных в репозиторий данных и анализатора, мне нужно добавить «дочерний» и «родительский» в качестве подмодулей напрямую grandparent
, чтобы получить лучший контроль над исходным кодом, вместо того child
, чтобы просто сидеть parent
и быть parent
подмодулем. И я также хочу parent
, чтобы у него была своя собственная копия child
, потому что разработка parent
является автономной и не зависит ни grandparent
от кого.
Файловая структура из трех репозиториев будет
grandparent
|-- src
|-- include
|-- submodules
|-- parent
|-- src
|-- include
|-- submodule
|-- child (trying to make this one not being checked out here)
|-- child (this one should be checked out)
parent
|-- src
|-- include
|-- submodules
|-- child (this one should be checked out)
child
|-- audio
|-- video
|-- pics
|...
Возможно ли достичь того, что я описал? Или что было бы наилучшей практикой в таком сценарии.
Комментарии:
1. Дедушка (супер-супер-репозиторий?) Не может напрямую предоставить внуку идентификатор хэша, потому что единственное, что хранится в дедушке, — это пара <имя, хэш-идентификатор> для промежуточного репозитория. Задача промежуточного репозитория — предоставить пару <имя, хэш-идентификатор> для внука, и эта пара происходит из коммита , что означает, что правильный коммит должен существовать в промежуточном.
2. Теперь, это правда, что идентификатор хэша в промежуточном элементе выходит из коммита и попадает в индекс промежуточного элемента, поэтому, если вы можете каким-то образом получить идентификатор хэша в этот индекс, вы можете заставить это работать. Но это оставляет часть «как-то», которую нужно определить.
3. С другой стороны, на картинке, которую вы нарисовали , нет структуры дедушки / дедушки / промежуточного / внука, а скорее одно суперрепо (родительское) с двумя дочерними элементами. У одного из двух дочерних элементов есть другой дочерний элемент в качестве собственного подмодуля. В этом случае вы можете просто позволить родительскому репозиторию самому проверять оба подмодуля. Но они будут рядом, а не в отношениях родитель / потомок.
4. (Я думаю, вы сказали все это в тексте, но я пытаюсь убедиться, что у всех одинаковое представление о настройке здесь, потому что в этом действительно вся сложность.)
5. @torek спасибо! И да, я намеренно создал файловую структуру
super-super-repo
так, как показано на рисунке, чтобы таким образомsuper-super-repo
можно было напрямую хранить значение хэша обоих подмодулей в себе. И поскольку существует много разныхsuper-super-repo
s, я не знаю, что хранить хэш коммита конкретногоsub-sub-repo
, необходимого asuper-super-repo
вintermediate repo
. И посколькуintermediate repo
он фактически разрабатывается отдельно, это также технически сложно сделать.
Ответ №1:
Учитывая (обновленную) картинку, я бы посоветовал избегать рекурсивного режима подмодуля и просто вручную (или по сценарию?) Выполнять любые необходимые git submodule update
команды в рабочем дереве grandparent
репозитория. То есть:
git clone $url grandparent
cd grandparent
git submodule update --init
В .gitmodules
(найденном grandparent/.gitmodules
после git clone
и .gitmodules
после cd
команды) будет указан URL-адрес для submodules/parent
и submodules/child
. Проверка, выполненная в новом grandparent
каталоге, созданном git clone
, когда git clone
достигает последнего шага клонирования (проверка), заполнит как индекс Git, так и ваше рабочее дерево, так что submodules/parent
и submodules/child
у обоих есть идентификатор хэша, записанный в индексе. Тогда git submodule update --init
он поймет, что ему нужно запустить две git clone
git checkout
команды and для заполнения submodules/parent
and submodules/child
.
Поскольку рекурсия отключена (и git submodule update
не указано, чтобы включить ее), клон parent
оставляет неклонированный подмодуль: submodules/parent/submodule/child
на данный момент это просто пустой каталог. Пока никто не запускает команду:
(cd submodules/parent amp;amp; git submodule update --init)
или, что эквивалентно, этот каталог будет продолжать оставаться пустым.
Комментарии:
1. О да, это сработало! я мало знал, что могу проверить конкретные подмодули. Быстрое отслеживание — есть ли хорошая практика для размещения файла в пустой папке подмодуля, которая не извлекается, указывая, что эта папка не используется, и пользователь должен ссылаться на другое местоположение? Я мог бы добиться этого с помощью некоторых сценариев bash, но просто интересно, предоставляет ли git какое-либо готовое решение для размещения некоторых заполнителей в папке неинициализированных подмодулей
2. Я не знаю какой-либо стандартной практики для этого. Тем не менее, примечание в каком-то файле documentation / build-instructions / README на верхнем уровне о структуре и использовании подмодулей кажется хорошей идеей.