为什么git无法获取给定提交的特定有效子模块以及如何修复它?

时间:2017-02-23 13:36:07

标签: git git-submodules git-commit

我有一个git repo,其中另一个是submodule依赖项。在我的项目的根目录中(.git.gitsubmodules等),我打电话给

git submodule update

此操作失败,并显示以下消息:

  

在子模块路径'src / framework'中获取,但它不包含cc8c38e9d853491c672452d8dbced4666fc73ec8。直接获取该提交失败。

其中src/framework是我项目的子目录(PROJECT_ROOT/src/framework),应该是第三方回购的地方。给定的提交哈希值是有效的。

我也试过了git clone --recursive <my-repo>,但也失败了。

.gitsubmodules的内容是

[submodule "src/framework"]
        path = src/framework
        url = git@gitlab-blah-internal.de:gh/framework.git

除此之外,我必须注意以下重要事实:由于framework repo中的最新更新,我的代码中断了,因此我真的需要检索它的特定版本,其中工作正常。

6 个答案:

答案 0 :(得分:18)

  

是的,我可以在我的网络浏览器中使用链接(使用GitLab)

你能否克隆那个回购,包括那个提交?
GitLab有permission level这将限制访问,因此请确保您的git clone命令是使用正确的用户执行的,并且使用所述user home directory/.ssh中的ssh键执行。

如果您无法自己克隆子模块存储库(在本地硬盘驱动器上的任何位置),则可以解释错误消息。

  

问题来自于在我正在使用的存储库中作为子模块链接之前已经将头重置为提交的人。这使得引用无效。我不知道如何解决这个问题

您可以make sure the submodule follows a branch(例如,master):

cd /path/to/parent/repo
git config -f .gitmodules submodule.bar1.branch master

然后在最后一次提取的提交master

中更新子模块
git submodule update --remote

--remote option确保使用超级项目记录的SHA-1更新子模块,但会使用子模块的远程跟踪分支的状态。

这样可以避免&#34; did not contain cc8c38e9d853491c672452d8dbced4666fc73ec8&#34;错误信息。

答案 1 :(得分:4)

在克隆后运行此命令(并收到错误)解决了我的问题:

git submodule update --force --recursive --init --remote

当然,这不是一个好的解决方案。最好找到并解决根本问题,但是如果有人急着,这对我来说是有用的。

答案 2 :(得分:1)

我的情况是子模块的url发生了更改,并且已与父存储库取消同步。我们注意到可以克隆父级,而子级可以毫无问题地进行初始化,但是存储库的这个特定实例失败了。

修复者:

  1. 检查网址是否为.gitmodules文件中的正确网址
  2. 呼叫git submodule sync
  3. 调用git -C path/to/submodule fetch(如果子模块已经初始化)
  4. 调用git submodule update --init [--recursive] path/to/submodule(如果子模块已经取消初始化)

答案 3 :(得分:1)

我不知道确切的问题是什么,但以下对我有用: (第四步是我认为的关键)

  1. git submodule update --init --recursive
  2. git pull --rebase --recurse-submodules
  3. git submodule update --force --recursive --init --remote
  4. git 子模块同步
  5. git submodule update --init --recursive

答案 4 :(得分:0)

对我来说,问题是该子模块指向托管在github上的个人(a的克隆)存储库。

我有多个主机存储库,其中包含对同一子模块的引用。 我在其中一个存储库中更改了子模块的HEAD,并提交了存储库。不幸的是,我忽略了将新的子模块HEAD推送到github,因此即使在git submodule update等之后,存储库的其他实例也没有最新头的记录。

答案 5 :(得分:-1)

下面的命令解决了问题

  • git 子模块同步