指定为相对路径时,无法添加git子模块

时间:2009-12-29 11:33:07

标签: git git-submodules

我正在尝试在我的git repo中添加一个子模块,我收到了这个错误:

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

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

我这样做:

git submodule add ../extern/Lib1 lib  

我希望这能创建一个子模块lib/Lib1
我知道这只会创建一个引用,然后我必须更新/ init(在这部分不清楚,没有那么远;我只是学习子模块命令)。

3 个答案:

答案 0 :(得分:30)

../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   这可以是绝对网址,或者(如果它以./../开头),相对于超级项目的 origin 存储库的位置< /强>

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


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

commit d1b3b81Stefan Beller (stefanbeller)(2017年2月25日) Junio C Hamano -- gitster --于2017年3月10日commit ae900eb合并)

  

submodule init:警告回到本地路径

作为now documented

  

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

     

默认遥控器是当前分支的远程跟踪分支的遥控器   如果不存在此类远程跟踪分支或已分离./foo.git,则假定“HEAD”为默认远程。   如果超级项目没有配置默认远程,则超级项目是其自己的权威上游和当前。   改为使用工作目录。


Git 2.20(Q8 2018)改进了子模块的本地路径支持。

commit e0a862fStefan Beller (stefanbeller)(2018年10月16日) (由Junio C Hamano -- gitster --合并于commit 3fc8522,2018年11月6日)

  

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

     

submodule helper”调用的子模块助手update_clone,   如果需要,克隆子模块。
  由于子模块过去有指示它们是否处于活动状态的URL,因此解析相对URL的步骤是在“git submodule update”步骤中完成的。现在可以将子模块配置为活动而不调用显式初始化,例如,通过配置submodule 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 [...] ”中的网址(在git submodule init函数的子模块帮助程序中),并在init_submodule帮助程序中的适当位置调用它。

答案 1 :(得分:4)

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

我(在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

此致 西蒙克纳普

答案 2 :(得分:1)

(我在这里总结了解决方案。感谢VonC。)

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

git remote add origin ..

(不确定为什么它是..而不是.。)

现在您可以添加子模块:

git submodule add ../extern/Lib1 lib