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

时间:2015-02-11 17:38:40

标签: git git-submodules

我正在尝试使用子模块克隆项目,并收到类似这样的消息:

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

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

重点是,不仅module_path中的模块没有任何地方的特定提交(我已经检查了每个遥控器中的所有遥控器和所有分支),但我找不到单个引用说在任何地方提交。

这是我尝试的事情的(部分)列表(我承认我对git存储库的内部不太了解,所以我的尝试在范围上非常普遍):

  1. 检查了有问题的模块,意外地正确检出到我希望它的ref(不是那个给我错误的那个),这是最后一次提交对于子模块
  2. 为整个树(包括.git子目录)插入包含违规参考的文件
  3. 树上的
  4. find(包括.git和子模块),文件名包含违规的参考号。
  5. 每个包文件上都有
  6. git verify-pack,为有问题的参考文件(请注意:我找到我想要的那个)
  7. .git/modules/<module name>中输入了相关的子模块,并在那里完成了上述操作(不是我希望找到任何东西,因为以前的所有操作都是递归的)
  8. 在本地镜像远程,克隆它,验证问题也可以这种方式重现,并在裸存储库中复制从1到5的所有测试
  9. 尝试dtruss(就像strace,但是在Mac上),没有找到任何与粗略相关的内容
  10. 检查reflog(不是我确实想要的)。没有骰子。
  11. 我想我可以尝试强制推动当前提交在遥控器上,但我真的想了解发生了什么,特别是:那个引用来自哪里?为什么我会收到这个错误?

    感谢您的帮助!

    更新找到了一个新的“玩具”:

    $ 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 证明裁判实际上存在于我的同事的机器上(他们在reflog中的位置,这就是为什么我乍看之下没有注意到它们),并且经过一些摆弄我修复了问题。但问题仍然存在: git在哪里保存子模块的引用

1 个答案:

答案 0 :(得分:1)

  

git在哪里保存子模块的引用?

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. 中的子模块网址
  3. .gitmodules
  4. 中的子模块路径
  5. 您的超级项目提交中的子模块提交(上面显示的那个)