【问题标题】:Can't add git submodule when specified as a relative path指定为相对路径时无法添加 git 子模块
【发布时间】:2010-12-30 18:12:11
【问题描述】:

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

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

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

我正在这样做:

git submodule add ../extern/Lib1 lib  

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

【问题讨论】:

  • 刚刚完成了我的回答并提出了其他建议
  • 我认为绝对路径在这里起作用只是因为你的extern/Lib1 Git repo ...没有“远程来源没有.git/config中定义的url”;)。对 .git/config 的一些调查是有序的。
  • 不确定您的意思。我刚刚查看了 extern/Lib1 的 .git/config,它只有 [core] 部分:repositoryformatversion=0,filemode=true,bare=false,legalrefupdates=true
  • 刚刚添加了一个关于应该在哪里定义“远程来源”的示例。请参阅我编辑的答案。
  • 您的最后一条评论让我重新阅读了 git 子模块手册页。我已编辑我的答案以获得相关 .git/config 文件的更准确位置。

标签: git git-submodules


【解决方案1】:

../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 存储库的位置。。 p>

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


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

参见Stefan Beller (stefanbeller)commit d1b3b81(2017 年 2 月 25 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit ae900eb,2017 年 3 月 10 日)

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

作为now documented:

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

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


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

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

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

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

当尝试获取以这种方式设置为活动的子模块时,我们将 回退到在 .gitmodules 中找到的 URL,它可能与 超级项目,但我们还没有解决它:

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”中的 URL(在 init_submodule 函数的子模块助手中)并在 update_clone 助手中的适当位置调用它。

【讨论】:

  • 是的。 ./lib 文件夹是空的(在“git submodule add ../extern/Lib1 lib”中)
  • 该死的。好的,所以绝对路径有效,相对路径无效……这在任何地方都没有提到(我已经阅读教程几个小时了,它们都使用 Web URL 作为示例)。问题是当其他人克隆我的存储库并且没有正确的目录嵌套时,“子模块初始化/更新”对他们不起作用......有什么想法吗?谢谢冯,不胜感激
  • 会按照你的建议去做。问题:这不只是将绝对路径从超级仓库(我们放置子模块的地方)移动到子模块引用的仓库中吗?在我的情况下,超级存储库和引用的存储库(来自子模块内部)都在同一个主目录 DirName(DirName/extern/Lib1 & DirName/NewRepo_withSubmodules)中。所以我希望能够移动那个主目录(DirName)而不破坏里面的配置。
  • 好问题,这让我重新访问了.git/config 文件位置。请参阅我编辑的答案。
  • 太棒了!所以它起作用了。为了使用外部子模块的相对路径,我必须首先执行以下操作(在新的非克隆仓库上):“git remote add origin ..”,然后是“git submodule add ../extern/LibName lib”。再次感谢维克!
【解决方案2】:

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

我有(在 Windows 上):

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

问候, 西蒙·纳普

【讨论】:

  • 对我不起作用(在 Linux 上)。它尝试通过 Internet 访问计算机 self
  • 也不能在 darwin 上工作:... [852]$ git submodule add -b myBranch self:../relativeRepo Cloning into relativeRepo... ssh: 无法解析主机名 self: nodename 或 servname provided, or not known fatal: 远程端意外挂断`clone of 'self:. ./relativeRepo' 进入子模块路径 'relativeRepo' 失败
【解决方案3】:

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

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

git remote add origin ..

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

现在你可以添加子模块了:

git submodule add ../extern/Lib1 lib

【讨论】:

  • 这对我不起作用 - 它仍然试图在本地路径中查找 ../extern/Lib1。我必须做git remote rename myrem origin,然后是git submodule add ../extern/Lib1 lib,然后是git remote rename origin myremgit submodule foreach git remote rename origin myrem
猜你喜欢
  • 2017-05-01
  • 1970-01-01
  • 2021-12-14
  • 2018-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多