../extern/Lib1
是指一个 Git 仓库吗?
如果不是的话,Git 就不会知道如何将 Git 仓库的 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,也可以是(如果以./
或../
开头)相对于超级项目的origin
仓库的位置。
因此,如果`NewRepo_withSubmodules`是一个刚创建的本地Git仓库(当然没有"origin"),则应定义一个人工的"remote origin"(即使该origin指向自身),只是为了允许使用其他子模块仓库的相对URL。
Git 2.13 (Q2 2017)将改进对子模块默认源的检测。
请参阅
commit d1b3b81(2017年2月25日)由
Stefan Beller (stefanbeller
)提交。
(由Junio C Hamano -- gitster
--在commit ae900eb中合并,2017年3月10日)
submodule init
: 警告回退到本地路径
根据现在的记录:
<repository>
是新子模块源代码库的URL。
它可以是绝对URL,也可以是相对于超级项目默认远程代码库的位置(如果以./
或../
开头)
(请注意,要指定一个位于超级项目'bar.git
'旁边的仓库'foo.git
',您必须使用'../foo.git
'而不是'./foo.git
' - 这与遵循相对URL规则时所期望的相对目录的评估在Git中是相同的)。
默认远程是当前分支的远程跟踪分支的远程。
如果不存在这样的远程跟踪分支或者HEAD
处于分离状态,则假定"origin
"为默认远程。
如果超级项目没有配置默认远程,则超级项目本身是其自己的上游权威,使用当前工作目录。
Git 2.20 (Q4 2018) 改进了子模块的本地路径支持。
请参阅
commit e0a862f(2018年10月16日)由
Stefan Beller (stefanbeller
) 提交。
(由 Junio C Hamano -- gitster
-- 合并于 commit 3fc8522, 2018年11月6日)
submodule helper
: 如果需要,将相对URL转换为绝对URL
The submodule helper update_clone
called by "git submodule update
", clones submodules if needed.
As submodules used to have the URL indicating if they were active, the step to resolve relative URLs was done in the "submodule init
" step. Nowadays, submodules can be configured active without calling an explicit init
, e.g. via configuring submodule.active
.
When trying to obtain submodules that are set active this way, we'll fallback to the URL found in the .gitmodules
, which may be relative to the superproject, but we do not resolve it, yet:
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
[...]
To resolve the issue, factor out the function that resolves the relative URLs in "git submodule init
" (in the submodule helper in the init_submodule
function) and call it at the appropriate place in the update_clone
helper.
"
“git submodule
”(man) 代码过于依赖来自配置文件(以及树内的 .gitmodules
文件)的数据,而没有进行验证,导致如果用户对存储库进行了更改(例如删除了 submodule.<name>.url
),会出现空指针解引用的问题。
这个问题已在 Git 2.42(2023 年第三季度)中得到修复。
"
查看
commit fbc806a(2023年5月24日)由
Taylor Blau (ttaylorr
) 提交。
(由 Junio C Hamano -- gitster
-- 合并于 commit 9cd234e,2023年6月20日)
builtin/submodule--helper.c
:处理缺失的子模块网址
报告者:Tribo Dar
签名者:Taylor Blau
In e0a862f ("submodule helper: convert relative URL to absolute URL if needed", 2018-10-16, Git v2.20.0-rc0 -- merge listed in batch #9), prepare_to_clone_next_submodule()
lost the ability to handle URL-less submodules, due to a change from:
if (repo_get_config_string_const(the_repostiory, sb.buf, &url))
url = sub->url;
to
if (repo_get_config_string_const(the_repostiory, sb.buf, &url)) {
if (starts_with_dot_slash(sub->url) ||
starts_with_dot_dot_slash(sub->url)) {
}
}
,which will segfault when sub->url
is NULL
, since both starts_with_dot_slash()
does not guard its arguments as non-NULL.
Guard the checks to both of the above functions by first checking whether sub->url
is non-NULL.
There is no need to check whether sub
itself is NULL
, since we already perform this check earlier in prepare_to_clone_next_submodule()
.
By adding a NULL-ness check on sub->url
, we'll fall into the 'else
' branch, setting url
to sub->url
(which is NULL).
Before attempting to invoke git submodule--helper clone
, check whether url
is NULL
, and die()
if it is.
extern/Lib1
Git存储库...没有“远程源在.git/config中没有定义url” ;). 需要在那个.git/config中进行一些调查。 - VonC.git/config
文件更精确的位置。 - VonC