git 试图克隆不存在的子模块引用

git trying to clone a submodule's ref that doesn't exist

我正在尝试克隆一个带有子模块的项目,我收到了这样一条消息:

fatal: reference is not a tree: da3d99e1e6c554231cba76066a7b3149592e597e
Unable to checkout 'da3d99e1e6c554231cba76066a7b3149592e597e' in submodule path 'module_path'

现在,我不是 git 模块的初学者,首先我检查了推送主项目的同事是否也忘记了推送模块,但事实并非如此。

要点是,不仅 module_path 中的模块在任何地方都没有特定的提交(我已经检查了所有遥控器和每个遥控器中的所有分支),而且我找不到一个参考说在任何地方提交。

这是我尝试过的(部分)列表(我承认我对 git 存储库的内部结构了解不多,所以我的尝试范围很广):

  1. 检查了有问题的模块,出乎意料的是 正确检出 到我期望的 ref(不是给我错误的那个),这是为子模块所做的最后一次提交
  2. grep 整个树(包括 .git 个子目录)以查找包含违规引用的文件
  3. find 在树上(包括 .git 和子模块)的文件名 包含 有问题的参考
  4. git verify-pack 在每个包文件上,寻找有问题的参考(不:我 确实找到 我期望的那个)
  5. .git/modules/<module name> 中输入了有问题的子模块,并在那里完成了上述操作(并不是我期望找到任何东西,因为所有以前的操作都是递归的)
  6. 在本地镜像远程,克隆它,验证问题也可以通过这种方式重现,并在裸存储库中复制从 1 到 5 的所有测试
  7. 尝试了 dtruss(类似于 strace,但在 Mac 上),但在 cursory 外观上没有找到任何相关内容
  8. 检查了 reflog(不是我期望的任何东西)。没有骰子。

我想我可以尝试在远程上强制向上推送当前提交,但我真的很想了解发生了什么,特别是:ref 来自哪里?为什么会出现该错误?

感谢您的帮助!

UPDATE 找到一个新的 "toy":

$ git cat-file -t da3d99e1e6c554231cba76066a7b3149592e597e
fatal: git cat-file da3d99e1e6c554231cba76066a7b3149592e597e: bad file

这发生在主 git 存储库和子模块的存储库中(相同的消息)

UPDATE2 找到命令 ls-tree 并且它 没有 报告特定子模块的违规引用

$ git ls-tree master:<plugin_location> |grep <plugin_name>
160000 commit afa6b85e6aac7dfa13b74fb26fe68055864cdebe  <plugin_name>

但是那个实际上是在子模块中签出的:(

UPDATE3 事实证明 refs 实际上存在于我同事的机器上(它们在 reflog 中的位置,这就是为什么我第一眼没注意到它们),然后有点摆弄我解决了这个问题。但是,问题仍然存在:git 在哪里保存子模块的引用

where does git save the ref of the submodules?

git log --patch <submodule path> 将显示子模块的更改。

来自我的一个回购协议的例子:

$ git log --patch tools

commit 3adfe4b33e4ade9da82983d268e60ca2e52268f9
Author: Alexander Groß <agross@therightstuff.de>
Date:   Wed Oct 22 16:50:12 2014 +0200

    The big Paket conversion

diff --git a/tools b/tools
index 84c72d3..c84d813 160000
--- a/tools
+++ b/tools
@@ -1 +1 @@
-Subproject commit 84c72d3cbe98e28d3b5c7643e7290085ec1551f7
+Subproject commit c84d813ebdae2fc9f2f14d5821cf820fbed42534

Git子模块存储三位信息:

  1. .gitmodules
  2. 中的子模块URL
  3. 子模块路径在.gitmodules
  4. 您的超级项目中的子模块提交(如上所示)