1

我有一个 git 项目(repo1),包括一个子模块(repo2)。我想要实现的是使用我的子模块的旧提交(如 HEAD - 3)标记我的项目。

我尝试将子模块签出到我想要的提交,但签出是错误的,因为在我的项目中提交不会跟踪正确的修订。我尝试将我的子模块重置为我想要的提交,提交项目,然后拉出子模块并提交项目,这也是错误的,因为:

$ git submodule update 
fatal: reference is not a tree: 2c3d1a5936aa9469ecc1442cd4b101e1bbd3aada
Unable to checkout '2c3d1a5936aa9469ecc1442cd4b101e1bbd3aada' in submodule path 'repo2'

什么是最好的——也是最好的——程序?


Git submodule head 'reference is not a tree' 错误给出了答案的开始,但它仍然链接 repo2 的 HEAD 而不是选择的提交......

假设现在标签已经完成,我如何告诉我的 repo1 将 repo2 设置为标签的正确状态:

 git checkout 0.0.1

根据git submodule update,一个简单的

 git submodule update

应该足够了。它不会将我的子模块签出到指定的提交。为什么 ?那是……错误吗?

4

1 回答 1

2

这个问题似乎真的很难,但事实并非如此。

完整的过程,从带有子模块 (repo2) 的 git repo (repo1) 开始。

$ git clone git@git:myproject.git
$ cd myproject
$ git submodule update --init

现在,如果我需要标记我的 repo2 的旧提交,这就是我要做的:

$ cd repo2
$ git checkout SOMECOMMITHASHORTAGORELSE
$ cd ..
$ git add repo2

adding 对于更新gitlink到 repo2 的提交哈希很重要

$ git commit repo2
$ git tag TAGNUMBER
$ git push (--tags if you want to push the tag also)

现在,为什么没有submodule update工作?事实是我一直在尝试检查与 repo1 标签关联的提交

$ git checkout TAGNUMBER
$ git submodule update

这不起作用只是因为(自我注意)我忘记了:

提交后应标记

所以这里没有真正的技巧,只是一个小陷阱,可能会再次发生在我们中的一些人身上,希望他们会在这里结束。

于 2011-05-16T13:29:21.253 回答