无法执行`git submodule foreach git pull`命令

6

这个问题基于这个讨论

我的.gitmodules文件在我的主目录下

[submodule "bin"]
           path = bin
           url = git://github.com/masi/bin.git

我的家庭文件夹结构:

~
|-- [drwxr-xr-x] bin          // this is the folder which I make a submodule
                              // it is also a folder where I have a Git to push my submodule's files
    | -- fileA
    ` -- folderA
    ...

我运行

git submodule init    # I get no output from these commands
git submodule update          

我运行

git submodule foreach git pull

我获得

Entering 'bin'
fatal: Where do you want to fetch from today?
Stopping at 'bin'; script returned non-zero status.

我修复这个bug的第一个假设是将path = bin更改为path = /Users/Masi/bin。然而,这并没有解决问题。

你如何从我的Git子模块中的外部存储库上传内容?


你的bin子模块的.git/config文件长什么样? - CB Bailey
@Charles:我的.git/config文件在https://dev59.com/FkjSa4cB1Zd3GeqPF4Pb#1155850。 - Léo Léopold Hertz 준영
你的 bin 子模块似乎是递归的了? - CB Bailey
为什么你认为 bin 子模块是递归的? - Léo Léopold Hertz 준영
如果您的bin子模块的.git/config文件也包含一个[submodule "bin"]部分,则该子模块可能是递归的(即,它将自身作为子模块包含在内)。这可能会导致很多混乱。 - Greg Hewgill
@Greg:请查看我对你在 https://dev59.com/FkjSa4cB1Zd3GeqPF4Pb#1157765 的评论的回答。 - Léo Léopold Hertz 준영
1个回答

5

通常发生这种错误是因为没有配置远程。
(来自this thread

这是一个修补程序,至少可以修复在很长时间之前初始化的存储库中运行 "git pull" 时出现的回归问题,该存储库不使用 .git/config 文件来指定我的远程存储库的位置。

一个更好的消息可能会是:

当前分支未配置默认远程,并且默认远程 "origin" 也没有配置。

我认为此消息由于先前无法访问而错过了变得用户友好的机会。


所以这个消息表示在.git/modules中提到的远程仓库没有在.git/config中声明。
来自git submodule 子模块不应与远程仓库混淆,远程仓库主要用于同一项目的分支;子模块是指您希望将不同项目作为源代码树的一部分,而两个项目的历史仍然完全独立,您无法从主项目内部修改子模块的内容。
我相信您可能错过了git submodule init这一步骤:
子模块初始化
初始化子模块,即将.gitmodules中找到的每个子模块名称和URL注册到.git/config中。 在.git/config中使用的键是submodule.$name.url。 此命令不会更改.git/config中的现有信息。 然后,您可以自定义本地设置中的子模块克隆URL,并继续执行git submodule update;如果您不打算自定义任何子模块位置,也可以只使用git submodule update --init而无需显式初始化步骤。
如果您在.git/modules中声明的远程存储库已经在.git/config中适当引用,您就不应再收到此错误消息。
在使用(拉取)子模块之前,需要进行以下步骤:
git submodule init
git submodule update

仍然必要。


注意:Git 2.42(2023 年第三季度)重写了给 submodule.<name>.update 配置变量提供自定义命令的说明。

参见 commit 7cebc5b(2023 年 7 月 25 日),作者为 Petar Vutov (pvutov)
(由 Junio C Hamano -- gitster -- 合并至 commit a53e8a6,2023 年 8 月 4 日)

doc:强调.gitmodules不支持!command 签名:Petar Vutov 修复了fc01a5d的错误(“子模块更新文档:不要重复自己”,2016年12月27日,Git v2.12.0-rc2 -- 合并)。 自定义命令none选项被描述为具有相同的限制,但一个可以在.gitmodules中使用,而另一个则不行。
重新编写自定义命令的描述,使其更加精确,并让读者更容易注意到自定义命令不能在.gitmodules文件中使用。

git submodule现在在其man page中包括以下内容:

如果在.gitmodules文件中存在,它还将复制submodule.$name.update的值到.git/config,但是(1)此命令不会更改.git/config中的现有信息,且(2)由于安全原因,设置为自定义命令的submodule.$name.update不会被复制。

您可以在.git/config中自定义子模块克隆URL。


我执行这些步骤 - 我澄清我的问题。 - Léo Léopold Hertz 준영
换句话说,命令也存在同样的问题。 - Léo Léopold Hertz 준영
不错的观点。我也遇到了类似的问题,结果发现我在其中一个子模块中意外地将远程仓库从origin重命名为upstream。将仓库名称更正为origin,然后Git会给出一些更实用的建议--如果您希望为此分支设置跟踪信息,可以使用以下命令:"git branch --set-upstream master origin/<branch>"。 - Jianwen W.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接