Как добавить подмодуль в подкаталог? - PullRequest
260 голосов
/ 27 января 2012

У меня есть git-репо в ~/.janus/ с кучей подмодулей в нем. Я хочу добавить подмодуль в ~/.janus/snipmate-snippets/snippets/, но когда я запускаю git submodule add <git@github.com:...> в каталоге snipmate-snippets, я получаю следующее сообщение об ошибке:

You need to run this command from the toplevel of the working tree.

Итак, вопрос: как добавить подмодуль в каталог snipmate-snippets?

Ответы [ 5 ]

373 голосов
/ 27 января 2012

Вы заходите в ~/.janus и запускаете:

git submodule add <git@github ...> snipmate-snippets/snippets/

Если вам нужна дополнительная информация о подмодулях (или git в целом), ProGit довольно полезен.

73 голосов
/ 01 июля 2013

Обратите внимание, что начиная с git1.8.4 (июль 2013 г.), вам больше не нужно возвращаться в корневой каталог.

 cd ~/.janus/snipmate-snippets
 git submodule add <git@github ...> snippets

( Bouke Versteegh комментариев , которые вам не нужно использовать /., как в snippets/.: snippets достаточно)

См. commit 091a6eb0feed820a43663ca63dc2bc0bb247bbae :

субмодуль: отбросьте требование верхнего уровня

Используйте новую опцию rev-parse --prefix, чтобы обработать все пути, заданные для команды субмодуля, отбросив требование, что он запускается из верхнегоуровень хранилища.

Поскольку интерпретация относительного URL-адреса субмодуля зависит от того, настроен ли «remote.origin.url», явно блокируйте относительные URL-адреса в «git submodule add», если он не находится на верхнем уровнерабочее дерево.

Подписано: Джон Кепинг

Зависит от коммит 12b9d32790b40bf3ea49134095619700191abf1f

Это делает 'git rev-parse 'ведут себя так, как если бы он был вызван из указанного подкаталогахранилище, с той разницей, что любые пути к файлам, которые он печатает, имеют префикс полного пути из верхней части рабочего дерева .

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

17 голосов
/ 09 августа 2013

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

У меня был подпроект с несколькими файлами, которые я до сих пор просто копировал, а не проверял в своем собственном git-репо. Я создал репо в подпапке, был в состоянии совершить, подтолкнуть и т. Д. Просто отлично. Но в родительском репо подпапка не рассматривалась как подмодуль, а ее файлы все еще отслеживались родительским репо - ничего хорошего.

Чтобы выйти из этого беспорядка, мне пришлось сказать Git, чтобы он прекратил отслеживать подпапку (без удаления файлов):

proj> git rm -r --cached ./ui/jslib

Тогда я должен был сказать, что там был субмодуль (что вы не можете сделать, если что-то там отслеживается в данный момент git):

proj> git submodule add ./ui/jslib

Обновление

Идеальный способ справиться с этим - еще пара шагов. В идеале, существующее хранилище перемещается в собственный каталог, без каких-либо родительских модулей git, фиксируется и отправляется, а затем добавляется в виде подмодуля, например:

proj> git submodule add git@bitbucket.org:user/jslib.git ui/jslib

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

Если вы не сделаете так, они будут работать нормально для вас, но как только вы совершите коммит и нажмете родителя, и другой разработчик потянет этого родителя, вы просто усложнили им жизнь. Им будет очень трудно воспроизвести структуру, имеющуюся на вашем компьютере, если у вас есть полный каталог .git в подпапке каталога, который содержит собственный каталог .git.

Итак, переместить, нажать, добавить подмодуль git, это самый чистый вариант.

15 голосов
/ 07 июля 2014

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

.git / config (личная конфигурация))

[submodule "cookbooks/apt"]
    url = https://github.com/opscode-cookbooks/apt

.gitmodules (подтвержденная общая конфигурация)

[submodule "cookbooks/apt"]
    path = cookbooks/apt
    url = https://github.com/opscode-cookbooks/apt

См. Также - разница между .gitmodules и указанием подмодулей в .git/ конфигурации?

2 голосов
/ 12 сентября 2014

однострочный bash-скрипт, чтобы помочь Крису ответить выше, так как я нарисовал себя в углу, также используя обновления Vundle для моих .vim-скриптовDEST - это путь к каталогу, содержащему ваши подмодули.Сделайте это после выполнения git rm -r $DEST

DEST='path'; for file in `ls ${DEST}`; do git submodule add `grep url ${DEST}/${file}/.git/config|awk -F= '{print $2}'` ${DEST}/${file}; done

ура

...