2012-01-13 127 views
9

我创建了一个git子模块并将其推送到我们的主存储库。这工作得很好,我可以通过浏览器在存储库中看到子模块。git子模块更新失败,但在一台机器上出错,但在另一台机器上工作

为了测试它工作正常,我试图让源是一个新的构建树。 首先我跑git submodule init,然后git submodule update <submodule-name>

这种失败,错误:

error: pathspec 'x/mypkg' did not match any file(s) known to git. Did you forget to 'git add' 

我尝试添加到.gitmodules的URL子模块,但没有运气。

回答

3

这很可能是因为您或团队中的某个人在您的子模块中发生了未发布(已提交但未推送到远程服务器)的更改。然后他们发布了超级项目,并引用了git服务器上不存在的子模块中的git commit。所以git试图拉下它找不到的特定子模块git commit ID。

如果更改位于计算机的其他位置或另一台计算机上,则会出现这种情况。

要解决该问题,请转到引用该提交并将子模块更改发布(推送)到服务器的存储库。或者更改子模块以指向不同的提交ID。

+0

我想我有一个非常相似的情况,但还不确定。我有一个库,我添加为一个新的子模块,另一个子模块使用这个库。我首先修改了库,提交并推送它,然后修改并推送使用它的子模块。没有人在我的情况下修改这些。奇怪的是,我无法更新使用该库的子模块。 – 2012-01-13 01:30:42

+0

@GauravSinha无论如何,如果你在'git submodule update'上得到错误,那是因为git repo找不到子模块指向的git commit ID。由于您在创建“新鲜树”时,要么是URL错误,要么您没有按子模块指向的提交。 – 2012-01-13 01:44:06

+0

似乎它可能是错误的URL,让我试试看,手指交叉.. – 2012-01-13 18:20:07

1

为了获得新的子模块到其他仓库,我相信你需要运行git submodule init一次才开始运行git submodule update;这将在.git/config中注册来自.gitmodules的新子模块。

+0

我在运行git submodule update命令之前运行过git submodule init。这不利于我们。更新我的问题以避免混淆。 – 2012-01-13 01:01:44

13

我还在尝试更新子模块时使用TortoiseGit收到此错误,该子模块不在索引中。也就是说,它们存在于.gitmodules中,但尚未正确添加到存储库中。

解决方法是使用.gitmodules中指定的路径手动重新添加它们。您可以使用TortoiseGit UI或每个模块的命令行中运行这个...

git submodule add <url> <path> 

Re-adding a git submodule

(我知道这可能是不适合原来的海报的解决方案,但希望它有助于其他人使用谷歌搜索。)

+0

我不得不添加' -force'来完成这个工作。 – 2018-02-23 17:25:25

相关问题