Как вложить подмодули Git в подмодули? - PullRequest
2 голосов
/ 07 ноября 2011

Я провел немало поисков по этому вопросу, но ни один из результатов совершенно не ударил по голове.

$ mkdir blah
$ git init
$ git submodule add -b 7.x http://git.drupal.org/project/drupal.git drupal
$ git submodule add -b 7.x-1.x http://git.drupal.org/project/devel.git drupal/sites/all/modules/contrib/devel

Затем я получил ошибку:

The following path is ignored by one of your .gitignore files:
drupal/sites/all/modules/contrib/devel
Use -f if you really want to add it.

Поэтому я добавляю параметр -f ...

$ git submodule add -f -b 7.x-1.x http://git.drupal.org/project/devel.git drupal/sites/all/modules/contrib/devel

... но, после клонирования в нужное место, я получаю эту ошибку:

fatal: Path 'drupal/sites/all/modules/contrib/devel' is in submodule 'drupal'
Failed to add submodule 'drupal/sites/all/modules/contrib/devel'

Я работаюна принципале, что после того, как все подмодули будут проверены на месте, я мог бы просто сделать «git clone --recursive» для репо «контейнера», который затем захватил бы Drupal, все мои модули «contrib» (из репозитория Drupal) +любые пользовательские модули, которые я бы добавил в drupal/sites/all/modules/custom.Мне все еще нужно исследовать, возможно ли автоматически сделать субмодуль соответствующим помеченным релизом с пометкой ...

Я видел сообщения о git-slave (стороннее дополнение) и git-subtree (это было похоже на добавление всех ваших подмодулей в ветки и их объединение на месте?!) ...

Я просто чувствую, что чего-то не хватает, так как это то, что SVN может сделать ДЕЙСТВИТЕЛЬНО легко, и все же, похоже, все борются с использованием Git ...

Ответы [ 2 ]

1 голос
/ 20 ноября 2014

Это очень старый вопрос, но .. Причина, по которой вы не можете сделать именно то, что вы пытались сделать, заключается в том, что git хранит только специальный тип файла "gitlink" для хранения указателя на указанный репозиторий (фактически конкретный коммит) и абсолютно ничего не знает о файлах в этом хранилище. В результате каталог в вашей исходной ссылке на подмодуль не существует, если речь идет о суперпроекте, и фактически заблокирован для использования в индексе git, поскольку он зарезервирован для использования подмодулем.

То, как мы это делаем, - это создание проекта, использующего репозиторий drupal в качестве отправной точки. Мы добавляем проекты drupal как подмодули базового хранилища.

git clone http://git.drupal.org/project/drupal.git drupal
cd drupal
# add submdoules inside the original drupal repository
git submodule add http://git.drupal.org/project/devel.git sites/all/modules/contrib/devel
# even better drush does this for you (but might require you install git_deploy first):
drush dl devel --package-handler=git_drupalorg --gitsubmodule
# commit
git commit -m"Add devel module"

Вы можете изменить пульт или добавить новый пульт и нажать там:

git remote set-url origin git@my-git-host.foo/my-project.git
git checkout -b my-branch-name
git push -u origin my-branch-name

И клонировать в другом месте с помощью --recursive:

git clone --recursive git@my-git-host.foo/my-project.git

Большое отличие от того, что вы пытались сделать, заключается в том, что корень Drupal является корнем репозитория git, а не подпапкой в ​​./drupal. Вы можете добавить этот настроенный проект drupal как подмодуль другого суперпроекта, если вам нужно, чтобы файлы, отслеживаемые версией, находились в каталоге выше корня drupal. Пока вы клонируете с --recursive, он будет повторяться в подмодули подмодулей, как и следовало ожидать.

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

1 голос
/ 16 февраля 2012

Я не хочу отвечать на ваш вопрос тем ответом, который вам не нужен, но вы можете подумать о том, чтобы основывать свои проекты на файлах drush make (и добавить этот файл в ваше git repo, не обращая внимания на каталог вашего модуля contrib).

Таким образом, вы отслеживаете только изменения в версиях вашего модуля, а не весь сам код, который сделают для вас drupals git-репозитории, и drush снесет его вниз. Я обнаружил, что это почти полностью избавляет от необходимости использовать подмодули git, в то же время дискретно привязывая текущее состояние моего сайта к самим добавленным модулям, не портя при этом мои различия.

...