Не может добавить подмодуль мерзавца при определении как относительный путь

Я пытаюсь добавить подмодуль к своему мерзавцу repo, и я получаю эту ошибку в ответ:

remote origin does not have a url defined in .git/config

какие-либо идеи о том, каково это могло бы быть? Я пытался гуглить для него, но только одна неопределенная ссылка подходит.

Я делаю это:

git submodule add ../extern/Lib1 lib  

Я ожидаю, что это создаст подмодуль lib/Lib1
Я знаю, что это только создаст ссылку и что я затем имею к update/init (не совершенно прозрачный на этой части, не получили это далеко; я просто изучаю команду подмодуля).

35
задан Mechanical snail 28 February 2012 в 07:16
поделиться

1 ответ

относится ли .../extern/Lib1 к Git-репозиторию?
... Если бы этого не произошло, Гит не знал бы, как заставить урну Git repo к нему . gitmodule
Также попробуйте:

  • с адресом назначения lib not уже существующий (даже пустой)
  • с абсолютным путем вместо относительного (вы можете использовать относительный, но на всякий случай, стоит попробовать здесь)

Некоторые хорошие источники на субмодулях:


Так как здесь работает только абсолютный путь, это означает, что относительный путь нуждается в ссылке для сравнения.
Эта ссылка - "удаленное происхождение", которое должно быть в Вашем файле DirName/NewRepo_withSubmodules/.git/config, например:

$ cat .git/config
    ...
    [remote "origin"]
    url = /path/to/DirName/NewRepo_withSubmodules/.git
    fetch = +refs/heads/*:refs/remotes/origin/*
    ...

Если у Вас есть этот раздел в файле .../DirName/NewRepo_withSubmodules/.git/config, Вы должны быть в состоянии добавить . ./Extern/Lib1 в качестве подмодуля, используя относительный путь.

Всё вышеизложенное взято из следующего раздела man-страницы подмодуля git'а:

<репозиторий> - это URL-адрес репозитория происхождения нового подмодуля.
. Это может быть либо абсолютный URL-адрес, либо (если он начинается с ./ или .../), местоположение относительно хранилища происхождения суперпроекта . Итак, если NewRepo_withSubmodules - это локальное Git-репо, которое только что было создано (и, конечно же, не имеет "происхождения"), то необходимо определить искусственное "удаленное происхождение" (даже если происхождение указывает само на себя), хотя бы для того, чтобы можно было использовать относительный url для других репозиториев субмодулей.


Git 2. 13 (Q2 2017) улучшит обнаружение происхождения субмодуля по умолчанию.

См. commit d1b3b81 (25 февраля 2017) в Stefan Beller (stefanbeller).
(Объединено Хунио К. Хамано -- Гитстер -- в совершает ae900eb, 10 марта 2017 года)

субмодуль init: предупреждают о возврате к локальному пути

, так как сейчас документировано:

<репозиторий> является URL-адресом репозитория происхождения нового субмодуля.
Это может быть либо абсолютный URL-адрес, либо (если он начинается с ./ или .../) местоположение относительно удаленного хранилища суперпроекта по умолчанию
. (Обратите внимание, что для указания репозитория 'foo.git'', который расположен рядом с суперпроектом 'bar.git', вам придется использовать '.../foo.git' вместо './foo. git' - как и следовало ожидать при следовании правилам для относительных URL - поскольку оценка относительных URL в Git'е идентична оценке относительных каталогов).

Удалённый по умолчанию - это удалённый доступ к удалённой отслеживающей ветке текущей ветки.
. Если такая удаленная ветка отслеживания отсутствует или HEAD отсоединен, то предполагается, что по умолчанию удаленным является "origin". Если суперпроект не имеет удаленной настройки по умолчанию, то суперпроект является своим собственным авторитетным восходящим и текущим. Вместо этого используется рабочий каталог.


Git 2.20 (Q4 2018) улучшает поддержку локальных путей для субмодулей.

См. commit e0a862f (16 октября 2018) на Stefan Beller (stefanbeller).
(Объединено Хунио С Хамано -- Гитстер -- в commit 3fc8522, 06 ноября 2018)

submodule helper: при необходимости преобразовать относительный URL в абсолютный

Вызов помощника субмодуля update_clone "git submodule update", клонирует субмодули, если нужно.
Так как раньше в подмодулях был указан URL, указывающий, активны ли они, шаг разрешения относительных URL был сделан на шаге "submodule init". В настоящее время подмодули могут быть настроены активными без явного вызова init, например, с помощью настройки submodule.active.

При попытке получить подмодули, которые настроены активными таким образом, мы будем откат к URL, найденному в .gitmodules , который может быть относительно суперпроект, но мы его еще не решили:

git-клон https://gerrit.googlesource.com/gerrit.
гитмодули cd gerrit && grep url .gitmodules
url = ../плагины/кодемир-редактор
...
субмодуль git-конфигурации.active .
обновление субмодуля git'а
фатальный: репозиторий ".../плагины/кодировщик/редактор* не существует.
fatal: клон '.../plugins/codemirror-редактора' в путь подмодуля '/tmp/gerrit/plugins/codemirror-редактор' не удался
Не удалось клонировать "плагины/кодировщик". Восстановление по расписанию
[...]
fatal: клон '.../plugins/codemirror-редактора' в путь субмодуля '/tmp/gerrit/plugins/codemirror-редактор' не удался
Не смог клонировать "плагины/кодемир-редактор" второй раз, прервав
[...]

Чтобы решить проблему, определите функцию, которая решает относительное URL в "git субмодуля init" (в помощнике субмодуля в функции init_submodule) и вызвать его в соответствующем месте в помощнике update_clone.

30
ответ дан 27 November 2019 в 15:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: