Не удается добавить подмодуль git, указанный в качестве относительного пути
-
21-09-2019 - |
Вопрос
Я пытаюсь добавить подмодуль в свое репозиторий git, и в ответ получаю эту ошибку:
remote origin does not have a url defined in .git/config
есть какие-нибудь идеи о том, что бы это могло быть?Я попытался поискать это в Google, но появилась только одна расплывчатая ссылка.
Я делаю это:
git submodule add ../extern/Lib1 lib
Я ожидаю, что это создаст подмодуль lib/Lib1
Я знаю, что это создаст только ссылку, и что затем мне нужно обновить / init (не совсем ясно в этой части, так далеко не продвинулся;Я просто изучаю команду подмодуля).
Решение
Делает ../extern/Lib1
ссылаться на репозиторий Git?
Если это не так, Git не знал бы, как добавить URL-адрес репозитория Git к своему .gitmodule
Кроме того, попробуйте:
- с пунктом назначения
lib
не уже существующий (даже пустой) - с абсолютным путем вместо относительного пути (вы можете использовать относительный путь, но на всякий случай стоит попробовать здесь)
Вот несколько хороших источников по подмодулям:
- глава 8 руководства пользователя Git
- Вики-страница по руководству по подмодулям Git
и, конечно - Справочная страница подмодуля Git
Поскольку здесь работает только абсолютный путь, это означает, что относительный путь нуждается в ссылке для сравнения.
Эта ссылка является "удаленным источником", который должен быть в вашем 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, либо (если он начинается с./
или../
), местоположение относительно суперпроектаorigin
хранилище.
Так что , если NewRepo_withSubmodules
является локальным репозиторием Git, которое только что было создано (и, конечно, не имеет "источника"), следует определить искусственный "удаленный источник" (даже если источник указывает на себя), хотя бы для того, чтобы разрешить использование относительного URL для других репозиториев подмодулей.
Git 2.13 (2 квартал 2017) улучшит определение источника подмодуля по умолчанию.
Видишь зафиксировать d1b3b81 (25 февраля 2017) автор Stefan Beller (stefanbeller
).
(Объединено Джунио Си Хамано -- gitster
-- в совершить ae900eb, 10 марта 2017)
submodule init
:предупреждать о возврате к локальному пути
<repository>
является URL-адресом исходного репозитория нового подмодуля.
Это может быть либо абсолютный URL, либо (если он начинается с./
или../
), местоположение относительно удаленного репозитория суперпроекта по умолчанию
(Пожалуйста, обратите внимание, что для указания репозитория 'foo.git
" который расположен прямо рядом с суперпроектом "bar.git
', вам придется использовать '../foo.git
" вместо "./foo.git
' - как и следовало ожидать, следуя правилам для относительных URL-адресов - поскольку оценка относительных URL-адресов в Git идентична оценке относительных каталогов).Пульт дистанционного управления по умолчанию - это пульт дистанционного управления ветви удаленного отслеживания текущей ветви.
Если такой ветви удаленного отслеживания не существует илиHEAD
является отстраненным, "origin
" предполагается, что это пульт дистанционного управления по умолчанию.
Если у суперпроекта не настроен пульт дистанционного управления по умолчанию, суперпроект является его собственным авторитетным восходящим потоком и текущим.вместо этого используется рабочий каталог.
Git 2.20 (4 квартал 2018) улучшает поддержку локального пути для подмодулей.
Видишь зафиксировать e0a862f (16 октября 2018) автор Stefan Beller (stefanbeller
).
(Объединено Джунио Си Хамано -- gitster
-- в зафиксировать 3fc8522, 06 ноября 2018)
submodule helper
:при необходимости преобразуйте относительный URL-адрес в абсолютный URLПомощник по подмодулям
update_clone
вызванный "git submodule update
", при необходимости клонирует подмодули.
Поскольку подмодули обычно имели URL-адрес, указывающий, были ли они активны, шаг по разрешению относительных URL-адресов был выполнен в "submodule init
" шаг.В настоящее время подмодули могут быть настроены активными без вызова явной инициализации, напримерчерез настройкуsubmodule.active
.При попытке получить подмодули, которые установлены активными таким образом, мы вернемся к URL, найденному в
.gitmodules
, который может быть связан с суперпроектом , но мы пока не решаем его:git clone https://gerrit.googlesource.com/gerrit cd gerrit && grep url .gitmodules url = ../plugins/codemirror-editor ... git config submodule.active . git submodule update fatal: repository '../plugins/codemirror-editor' does not exist fatal: clone of '../plugins/codemirror-editor' into submodule path '/tmp/gerrit/plugins/codemirror-editor' failed Failed to clone 'plugins/codemirror-editor'. Retry scheduled [...] fatal: clone of '../plugins/codemirror-editor' into submodule path '/tmp/gerrit/plugins/codemirror-editor' failed Failed to clone 'plugins/codemirror-editor' a second time, aborting [...]
Чтобы устранить проблему, исключите функцию, которая разрешает относительные URL-адреса в "
git submodule init
" (в помощнике подмодуля вinit_submodule
функцию) и вызовите ее в соответствующем месте вupdate_clone
помощник.
Другие советы
Я пробовал то же самое и обнаружил следующее: "кажется, сработало:
У меня есть (в Windows):
D:/phd/analyses
/analysis1/ #This is an existing repository
/analysis2/ #another existing repository
/analysis3.tex
/analysis4.tex
...
/analysisN.tex
analysis1.tex ... analysisN.tex
содержать идеи, над которыми я еще не работал (скажем, заглушки), и 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
С уважением, Саймон Кнапп
(Я кратко изложил здесь только решение.Заслуга принадлежит VonC.)
В содержащем хранилище (скажем containing.git/
), git
интерпретирует относительные пути как относительно origin
удаленный, который не определен.Мы хотим, чтобы это было относительно containing.git/
каталог, так что запускайте
git remote add origin ..
(Не уверен, почему это ..
вместо того , чтобы .
.)
Теперь вы можете добавить подмодуль:
git submodule add ../extern/Lib1 lib