2015-02-11 86 views
1

我试图克隆与子模块的一个项目,我得到这样一个消息:混帐试图克隆子模块的裁判不存在

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

现在,我不是第一个使用git模块的计时器,首先我检查推动主项目的同事是否忘记以某种方式推动模块,,事实并非如此。

问题是,不仅module_path中的模块没有任何地方的特定提交(我已经检查了每个远程中的所有远程和所有分支),但是我找不到任何地方提交的单个引用。

这是我试过的东西(部分)列表(我承认我不知道很多关于一个Git仓库的内部结构,所以我尝试在范围上相当普遍):

  1. 检查有问题的模块,并意外地正确签出到ref我希望它是(不是那个给我的错误),这是最后提交的子模块
  2. grepped包含违规参考文件的整个树(包括.git子目录)
  3. find树上(包括.git和子模块)的文件名为,其中包含违规参考文献。
  4. git verify-pack对每一个包文件,grepping为违规REF(没了:我确实觉得一个我期待,虽然)
  5. 进入了.git/modules/<module name>有问题的子模块,并且也完成上述操作存在(不是我期望找到任何东西,因为以前的所有操作都是递归的)
  6. 镜像远程本地,克隆它,验证问题可以用这种方式重现,并且复制裸仓库中所有测试从1到5以及
  7. 尝试dtruss(它就像strace,但在Mac上),没有f插入任何相关的东西粗略
  8. 检查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保存子模块的引用?

+1

检查http://stackoverflow.com/a/2161389/1860929 – 2015-02-11 19:23:07

+0

谢谢你的回答(一个高质量的,顺便说一句),现在,在最后一次更新后,问题*解决了,我'd仍然想知道git在哪里找到子模块的引用(并且引用的来源似乎没有回答这个问题)。 – Rick77 2015-02-12 09:29:34

回答

1

git保存子模块的引用?

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

从我的回购协议的一个例子:

$ git log --patch tools 

commit 3adfe4b33e4ade9da82983d268e60ca2e52268f9 
Author: Alexander Groß <[email protected]> 
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. 子模块URL中.gitmodules
  2. 子模块路径.gitmodules
  3. 的子模块提交您的超级项目提交(上面显示的那个)
+0

非常感谢(我的**非常愚蠢:我查了每个地方,但最明显的是,就是这样,具体提交......难怪,不管我看的地方,我都无法找到ref字符串:))!!! – Rick77 2015-02-12 11:31:03