子模块已提交分支不再可用

hkassir72

在存储库中,分支将子模块(称为子存储库)设置为特定提交。但是,此提交不再存在(合并到另一个提交中)。现在,当我尝试拉回购分支时,出现此错误:

git submodule update --init sub-repo
fatal: reference is not a tree: xxxxx
Unable to checkout 'xxxxx' in submodule path 'sub-repo'

我能够通过手动拉出子模块然后提交来解决问题

git checkout --branch valid-branch sub-repo
git add sub-repo
git commit

但是我不确定这是否是系统的方法。有任何想法吗?

星期二

TL; DR:您所做的很好,尽管可能不完整。


这是子模块的一个普遍缺陷:子模块依靠哈希ID依赖于确切的提交哈希。超级项目记录子模块提交的哈希ID,作为超级项目提交的一部分。

通常,人们不会从Git存储库中删除提交,因此可行。让我们将超级项目存储库称为R,并将子模块存储库称为S(“ superproject”和“子模块”都以S开头,但不能都为S)。R中的某些提交告诉Git:S中C通过此保存的哈希ID检出提交一旦S中C不再存在所有这些R提交现在都将无效。因此,如果您将repo S用作子模块,并且依赖S中的commit ,那么有人将从S中删除CC,您会遇到此问题。在一个存储库中,不可能删除其余存储库所需的提交。但是在单独的存储库中,依赖项只是S甚至不知道R正在使用的原始哈希ID ,这很容易做到,包括错误地做到了。

除了“不这样做”,该解决方案是进入上层项目的存储库[R -and做出新的提交,要么参考一些其他犯小号,或者不再使用š可言。如果您可以控制储存库,还是有一定的理由相信,小号(或在某些提交小号)应该是稳定的,并保持现有永远保持小号作为一个子模块是合理的。如果您无法控制S并且被证明是不稳定的,那么像这样依赖它可能是不明智的。

由于子模块一个Git存储库,因此您在其中选择提交的方式就是将其cd放入Git存储库中并将其作为Git存储库使用(这就是您所做的)。然后,一旦子模块处于C2您确定这次稳定的某个新提交上,就可以像以前一样R中进行新提交如果旧R提交和新R提交之间唯一的不同是新R提交具有不同的子模块哈希,则可以将R中的新提交称为旧提交的新改进版本。

你可能会考虑扔掉(和/或与新和改进的版本取代)是指所有的旧提交C小号1不过,如果这是可行的,因为去除C打破他们。做到这一点很难,这就是为什么没有工具的原因(除非BFG增长了子模块替换工具)。可能应该有一个git filter-branch专门用于替换子模块过滤器。但是,即使找到这些提交也有些棘手:您必须仔细检查R中的每个提交,并可能将它们复制到新的和改进的替换提交中这就是两种工具(BFG和git submodule)就是要做的。(通常,他们希望对某些文件进行更改,而不是对某些子模块进行更改,但这意味着它们拥有所有逻辑和所有内容,它们只需要某种方式来标识和替换子模块哈希ID。 )


1如以下注释中所述,这是从R到(C-in- S的引用,即不再存在的提交。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章