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