我试图克隆与子模块的一个项目,我得到这样一个消息:混帐试图克隆子模块的裁判不存在
fatal: reference is not a tree: da3d99e1e6c554231cba76066a7b3149592e597e
Unable to checkout 'da3d99e1e6c554231cba76066a7b3149592e597e' in submodule path 'module_path'
现在,我不是第一个使用git模块的计时器,首先我检查推动主项目的同事是否忘记以某种方式推动模块,,事实并非如此。
问题是,不仅module_path
中的模块没有任何地方的特定提交(我已经检查了每个远程中的所有远程和所有分支),但是我找不到任何地方提交的单个引用。
这是我试过的东西(部分)列表(我承认我不知道很多关于一个Git仓库的内部结构,所以我尝试在范围上相当普遍):
- 检查有问题的模块,并意外地正确签出到ref我希望它是(不是那个给我的错误),这是最后提交的子模块
- grepped包含违规参考文件的整个树(包括
.git
子目录) find
树上(包括.git
和子模块)的文件名为,其中包含违规参考文献。git verify-pack
对每一个包文件,grepping为违规REF(没了:我确实觉得一个我期待,虽然)- 进入了
.git/modules/<module name>
有问题的子模块,并且也完成上述操作存在(不是我期望找到任何东西,因为以前的所有操作都是递归的) - 镜像远程本地,克隆它,验证问题可以用这种方式重现,并且复制裸仓库中所有测试从1到5以及
- 尝试
dtruss
(它就像strace
,但在Mac上),没有f插入任何相关的东西粗略看 - 检查
reflog
(不是我所期望的任何东西)。没有骰子。
我想我可以尝试在远程上向上推动当前的提交,但我真的很想知道发生了什么,特别是:这个ref是从哪里来的?为什么我得到这个错误?
感谢您的帮助!
UPDATE发现了一个新的 “玩具”:
$ 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结果是裁判我的同事的机器上实际存在的一个实际签出(他们在引用日志在哪里,这就是为什么我一开始没有注意到他们瞥一眼),并在经过一番调整之后,我解决了这个问题。但问题仍然存在:git保存子模块的引用?
检查http://stackoverflow.com/a/2161389/1860929 – 2015-02-11 19:23:07
谢谢你的回答(一个高质量的,顺便说一句),现在,在最后一次更新后,问题*解决了,我'd仍然想知道git在哪里找到子模块的引用(并且引用的来源似乎没有回答这个问题)。 – Rick77 2015-02-12 09:29:34