我正在尝试将一个子模块添加到我的 git 存储库中,但我得到了这个错误作为回报:
remote origin does not have a url defined in .git/config
关于这可能是什么的任何想法?我试着用谷歌搜索它,但只有一个模糊的链接出现。
我正在这样做:
git submodule add ../extern/Lib1 lib
我希望这会创建一个子lib/Lib1
模块子模块命令)。
我正在尝试将一个子模块添加到我的 git 存储库中,但我得到了这个错误作为回报:
remote origin does not have a url defined in .git/config
关于这可能是什么的任何想法?我试着用谷歌搜索它,但只有一个模糊的链接出现。
我正在这样做:
git submodule add ../extern/Lib1 lib
我希望这会创建一个子lib/Lib1
模块子模块命令)。
是否../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开头../
),相对于超级项目的origin
repository的位置。
因此,如果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
。
我正在尝试同样的事情,并发现以下“似乎有效:
我有(在窗户上):
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
问候,西蒙·纳普
(我在这里只总结了解决方案。归功于 VonC。)
在包含存储库(例如containing.git/
)中,git
将相对路径解释为相对于origin
未定义的远程。我们希望它是相对于containing.git/
目录的,所以运行
git remote add origin ..
(不知道为什么它是..
而不是.
。)
现在您可以添加子模块:
git submodule add ../extern/Lib1 lib