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

StackOverflow https://stackoverflow.com/questions/1974181

  •  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 не уже существующий (даже пустой)
  • с абсолютным путем вместо относительного пути (вы можете использовать относительный путь, но на всякий случай стоит попробовать здесь)

Вот несколько хороших источников по подмодулям:


Поскольку здесь работает только абсолютный путь, это означает, что относительный путь нуждается в ссылке для сравнения.
Эта ссылка является "удаленным источником", который должен быть в вашем 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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top