Как включить и выключить» подмодуль git на основе статуса репозитория

#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 , необходимого a super-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 на верхнем уровне о структуре и использовании подмодулей кажется хорошей идеей.