42

我正在尝试将一个子模块添加到我的 git 存储库中,但我得到了这个错误作为回报:

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

关于这可能是什么的任何想法?我试着用谷歌搜索它,但只有一个模糊的链接出现。

我正在这样做:

git submodule add ../extern/Lib1 lib  

我希望这会创建一个子lib/Lib1
模块子模块命令)。

4

3 回答 3

35

是否../extern/Lib1引用 Git 存储库?
如果没有,Git 将不知道如何将 Git repo url 添加到其.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,或者(如果它以./or开头../),相对于超级项目的originrepository的位置。

因此,如果NewRepo_withSubmodules是一个刚刚创建的本地 Git 存储库(当然没有“起源”),则应该定义一个人为的“远程起源”(即使起源指向自身),如果只是为了允许相对 url要使用的其他子模块存储库。


Git 2.13(2017 年第二季度)将改进对子模块默认来源的检测。

请参阅Stefan Beller ( )的提交 d1b3b81(2017 年 2 月 25 日) 。(由Junio C Hamano 合并——提交 ae900eb中,2017 年 3 月 10 日)stefanbeller
gitster

submodule init: 警告回退到本地路径

正如现在记录的

<repository>是新子模块的源存储库的 URL。
这可能是一个绝对 URL,或者(如果它以./or开头../)相对于超级项目的默认远程存储库的位置
(请注意,要指定foo.git位于超级项目“”旁边的存储库“ bar.git”,您将必须使用 ' ../foo.git' 而不是 ' ./foo.git' - 正如人们在遵循相对 URL 规则时所期望的那样 - 因为 Git 中相对 URL 的评估与相对目录的评估相同)。

默认远程是当前分支的远程跟踪分支的远程。
如果不存在这样的远程跟踪分支或HEAD已分离,origin则假定“”为默认远程。
如果超级项目没有配置默认远程,则超级项目是它自己的权威上游和当前。而是使用工作目录。


Git 2.20(2018 年第四季度)改进了对子模块的本地路径支持。

请参阅Stefan Beller ( ) 的提交 e0a862f(2018 年 10 月 16 日(由Junio C Hamano 合并 -- --提交 3fc8522中,2018 年 11 月 6 日)stefanbeller
gitster

submodule helper: 如果需要,将相对 URL 转换为绝对 URL

update_clone“”调用的子模块助手git submodule update,如果需要,克隆子模块。
由于子模块使用 URL 指示它们是否处于活动状态,因此解析相对 URL 的步骤在“ submodule init”步骤中完成。如今,子模块可以在不调用显式 init 的情况下配置为活动的,例如通过配置submodule.active

当尝试获取以这种方式设置为活动的子模块时,我们将回退到 中找到的 URL,该 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

于 2009-12-29T12:23:35.247 回答
5

我正在尝试同样的事情,并发现以下“似乎有效:

我有(在窗户上):

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

analysis1.tex ... analysisN.tex包含我还没有研究过的想法(比如'stubs),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

问候,西蒙·纳普

于 2011-07-14T01:56:36.623 回答
1

(我在这里只总结了解决方案。归功于 VonC。)

在包含存储库(例如containing.git/)中,git将相对路径解释为相对于origin未定义的远程。我们希望它是相对于containing.git/目录的,所以运行

git remote add origin ..

(不知道为什么它是..而不是.。)

现在您可以添加子模块:

git submodule add ../extern/Lib1 lib
于 2012-02-28T04:42:44.613 回答