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

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

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

любые идеи о том, что это может быть? Я попробовал поиск по Google, но только одна неопределенная ссылка появляется.

Я делаю это:

git submodule add ../extern/Lib1 lib  

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

Ответ 1

Относится ли ../extern/Lib1 к репозиторию Git?
Если это не так, Git не знает, как иметь репо-код Git для его .gitmodule
Кроме того, попробуйте:

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

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


Поскольку здесь работает только абсолютный путь, это означает, что для относительного пути нужна ссылка для сравнения.
Эта ссылка является "удаленным источником", который должен находиться в вашем файле 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 в качестве подмодуля, используя относительный путь.

Все вышеизложенное описано в следующем разделе Git:

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

Итак, если NewRepo_withSubmodules является локальным репо Git, которое только что было создано (и, конечно, нет "происхождения" ), необходимо определить искусственное "дистанционное происхождение" (даже если начало указывает на себя), если только разрешить использование относительного URL-адреса для других репозиториев подмодулей.


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

См. commit d1b3b81 (25 февраля 2017 г.) Стефан Беллер (stefanbeller).
(слияние Junio ​​C Hamano - gitster - в совершить ae900eb, 10 марта 2017 года)

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

Как теперь документировано:

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

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

Ответ 2

Я пытался сделать то же самое, и нашел следующее: "Кажется, сработало:

У меня (на окнах):


D:/phd/analyses
    /analysis1/ #This is an existing repository
    /analysis2/ #another existing repository
    /analysis3.tex
    /analysis4.tex
    ...
    /analysisN.tex

analysis1.tex ... analysisN.tex содержат идеи, над которыми я еще не работал ("stubs, say), и analysis1/ и analysis2/ - это то, над чем я работаю (и, следовательно, в них есть код, tex,...), Как только я перейду к работе над другими анализами, они будут перемещены в свои собственные папки и, следовательно, их собственные репозитории.

Что я сделал (в git bash в анализах):


git init
git add *.tex
git remote add self .
git submodule add self:/analysis2/.git analysis2
git submodule add self:/analysis5/.git analysis5
git commit -m "Initial commit"

Кажется, что это сработало.

D:/phd/analyses/.git/config выглядит так, и .gitmodules выглядит следующим образом:


[submodule "analysis2"]
    path = analysis2
    url = self:analysis2/.git
[submodule "analysis5"]
    path = analysis5
    url = self:analysis5/.git

С уважением, Саймон Кнапп

Ответ 3

(Я кратко изложил здесь решение. Кредит отправляется в VonC.)

В содержащем репозитории (скажем containing.git/) git интерпретирует относительные пути относительно удаленного origin, который не определен. Мы хотим, чтобы он был относительно каталога containing.git/, поэтому запустите

git remote add origin ..

(Не уверен, почему он .., а не ..)

Теперь вы можете добавить подмодуль:

git submodule add ../extern/Lib1 lib