如果包含项目不在master分支上,则递归推送子模块将抛出“致命错误:src refspec必须命名一个引用”

Kai*_*rdt 5 git git-submodules

我有一个带有三个子模块的git存储库。包含的存储库有两个分支masterdevelop。所有子模块只有一个分支– master分支。

当包含的存储库位于master分支上时,git push --recurse-submodules=on-demand将按预期方式通过原点推送。包含项目及其子模块均被推送。

现在这是问题所在。当包含存储库在develop分支上时,通过推送时出现问题git push --recurse-submodules=on-demand。推送操作被取消,并显示错误消息。

这是我从git获得的完整输出:

$ git push --recurse-submodules=on-demand
fatal: src refspec 'refs/heads/develop' must name a ref
fatal: process for submodule 'Frameworks/OpenLearnWareClient' failed
Run Code Online (Sandbox Code Playgroud)

我可以通过首先手动推送每个子模块中的更改,然后推送包含的存储库来缓解此问题。但是,这非常繁琐,并且违反了的目的--recurse-submodules=on-demand

这是我的.gitmodules文件:

[submodule "Frameworks/OpenLearnWareKit"]
    path = Frameworks/OpenLearnWareKit
    url = git@github.com:kaiengelhardt/OpenLearnWareKit.git
    branch = master
[submodule "Frameworks/OpenLearnWareClient"]
    path = Frameworks/OpenLearnWareClient
    url = git@github.com:kaiengelhardt/OpenLearnWareClient.git
    branch = master
[submodule "Frameworks/KEFoundation"]
    path = Frameworks/KEFoundation
    url = git@github.com:kaiengelhardt/KEFoundation.git
    branch = master
Run Code Online (Sandbox Code Playgroud)

我正在使用git版本2.20.1(Apple Git-117)。

有人知道这里出了什么问题以及如何进行递归推送吗?

Kon*_*lph 9

据我所知(我\xe2\x80\x99d喜欢被证明是错误的!)子模块分支没有\xe2\x80\x9crecursive push\xe2\x80\x9d。一般来说,子模块中的分支是一种奇怪的野兽,don\xe2\x80\x99t 的工作方式与 Git 中的常规分支相同。

\n

一个接近的解决方法是使用git submodule foreach命令来执行推送。这仍然很烦人,但至少它解决了 \xe2\x80\x9ctedious\xe2\x80\x9d 方面。按如下方式组合命令以确保子模块推送失败会中止父模块推送:

\n
git submodule foreach --recursive \'git push\' &&\ngit push\n
Run Code Online (Sandbox Code Playgroud)\n

据我所知,这本质上等同于 pass --recurse-submodules=on-demand,但适用于分支。

\n

  • @TS 不幸的是我没有针对这种情况的解决方案。**但是**一般来说,您应该镜像所有子模块遥控器。也就是说,项目中的子模块应该具有您控制的遥控器,因此您拥有其推送权限;否则你的项目是脆弱的:如果你的子模块之一的上游维护者决定删除他们的存储库,或者以其他方式对存储库进行破坏性更改,那么你就完蛋了。 (2认同)