Git子模块。将其拉入超级项目的新克隆版本。

91

好的,我认为我已经解决了这个问题...但现在...

我的项目包括 GitHub 上的一个小库作为子模块。 在该超级项目的原始版本中,子模块按预期工作。

然而,我刚刚克隆了超级项目,做了我认为应该做的事情:"git submodule init",让子模块的目录出现了,但是它是空的。

如果现在我尝试执行

git submodule update

我理解了

fatal: Needed a single revision 
Unable to find current revision in submodule path 'external_libraries/BEACHhtml'

如果我尝试

git submodule foreach git pull

我明白了

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

在我的.git/config文件中,我有以下内容:

[submodule "external_libraries/BEACHhtml"]
    url = git@github.com:interstar/BEACHhtml.git

我在我的 .gitmodules 文件中有这样的内容:

[submodule "external_libraries/BEACHhtml"]
path = external_libraries/BEACHhtml
url = git@github.com:interstar/BEACHhtml.git

有人知道缺什么吗?

7个回答

197

根据下面的评论,似乎现在(2019年)安装最新的GIT客户端可以解决这个问题。这应该是目前最好的解决方案。


我和你遇到了同样的问题。这是git中的一个bug:http://git.661346.n2.nabble.com/BUG-git-submodule-update-is-not-fail-safe-td7574168.html

简而言之,对于你的问题,尝试:

# rm -rf external_libraries/BEACHhtml
# git submodule update

看起来之前的检出文件夹出了些问题,将其删除,然后再更新就能解决问题。


1
对我来说,是一个挂起的 git-fetch 导致了文件夹被锁定。 - Mihai Timar
35
我必须移除子模块工作树(ext/blah)和匹配的GIT_DIR文件夹下的相应目录(.git/modules/ext/blah)。 - Tobu
3
在我的情况中,git submodule update 在我的 CI 服务器上一直无法成功,因为它需要有人接受 RSA 密钥(CI 服务器通常使用 HTTPS 连接,而这是第一次子模块使用 SSH 连接进行拉取)。希望这可以帮助某个人节省一个小时的头痛! - Maverik
8
2016年这个漏洞仍然存在 :( - Paulo Neves
7
2017年报到,依旧存在。 - william.taylor.09
显示剩余7条评论

5

通过删除两个目录并重新获取子模块来解决:

  1. 进入 external_libraries/BEACHhtml 目录,查看 .git 文件。它的内容应该类似于 gitdir: ../../.git/modules/external_libraries/BEACHhtml
  2. 删除 external_libraries/BEACHhtml.git/modules/external_libraries/BEACHhtml 目录。

从现在开始,运行 git submodule update 将不会出现错误。


在执行 git submodule update 命令之前,您可能需要先运行 git submodule init 命令以重新初始化子模块,然后才能使其正常工作。 - Pellet

3

我曾遇到这个问题(网络不稳定,导致子模块检出失败),我通过编写一个脚本来解决它(命名为 git-submodule-fix,这样我就可以使用 git submodule-fix 来运行它)。

#!/bin/bash 

for arg 
do 
  echo $arg 
  find . -name "`basename $arg`" | grep "$arg\$" | xargs rm -fr
done

如果您从git submodule update获取了这个i.e.
fatal: Needed a single revision
Unable to find current revision in submodule path 'some/submodule/path'


git submodule-fix some/submodule/path
git submodule update

1
如果您正在2019年或之后阅读,请更新git客户端。这对我有用。

1
我在2021年遇到了这个问题,当时我处于“calling”主要仓库中提交的子模块仓库源代码和版本之间的分离状态。
这个答案帮了我:如何修复Git分离的HEAD? 我还通过对子模块仓库进行新更改来验证了这个策略:
  1. $ cd <进入calling/main repo中的子模块目录>
  2. $ git pull --> 子模块仓库从其源代码中获取任何更改
  3. $ cd <返回calling/main repo>
  4. $ git status --> 应该显示子模块仓库需要提交的新更改

0

我在一个项目中遇到了与子模块相关的同样问题。当我尝试单独克隆子模块时,它正常工作。

我尝试了以上所有答案,但都没有成功(git submodule update,...,移除子模块文件夹,...)。

这个问题在更新git(从Git-1.7.11-preview20120710)到最新版本(Git-1.8.1.2-preview20130201)后消失了。奇怪的是我的同事们甚至使用更旧的版本,而且没有任何问题,但他们是在Mac上工作。我是在Win7 64位上工作。


0

使用差异工具比较原始克隆版本和当前版本。此外,查看git submodule的输出。在执行操作之前,请确保每个仓库都指向相同的分支。

我怀疑您已经切换到了一个没有定义子模块的分支或旧版本。

希望这可以帮助您。


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