Git在添加主存储库之前恢复主存储库后未删除子模块
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Git在添加主存储库之前恢复主存储库后未删除子模块相关的知识,希望对你有一定的参考价值。
这是怎么发生的:
- 我签出了一个分支,其中添加了一个新的子模块。
- 然后,当子模块无法添加时,我回到了另一个分支上的提交。
- 现在我无法编译,因为检出的子模块仍在磁盘上;文件存在,如果我转到终端上的根目录,它仍然存在。
所以我该如何解决?当我返回从未存在的提交时,为什么不git删除该文件夹。
我尝试过:
- 主仓库上的[
git submodule update
。 git reset --hard
在子模块的仓库中。- 主仓库中的[
git reset --hard
。
没有什么可以删除。我不想手动删除它,因为这不是git方法。
那么我该如何解决?
[从工作树中手动删除所有子模块文件:例如rm -rf submodule
。
为什么我回到以前从未存在过的提交时为什么没有git删除该文件夹。
子模块很乱。
记住,Git中的一个子模块实际上只是另一个Git存储库。这个其他Git存储库完全完全独立于您的主(超级项目)存储库。或更确切地说,可能是-您将只有两个并排的单独克隆,它们之间根本没有任何交互-除了您已将子模块克隆粘贴到superproject 。并且,在此过程中:
在现代Git中,存储库本身被“吸收”到超级项目的存储库目录中(因此,没有
.git
子-文件夹,而是工作中的.git
file-子模块中已检出提交的树副本)。超级项目的Git在超级项目的配置(不仅是
.gitmodule
文件)中而且在某些提交中记录了子模块的内容。特别是,在应该以某个特定哈希ID检出子模块的提交中,哈希ID本身作为gitlink条目存储在每个提交中。- 超级项目的Git将
,这是另一个问题;这取决于您是否启用了子模块递归。)cd
插入子模块并执行git checkout <hash-id>
,这将HEAD分离到子模块中。 (恰恰是[[when- 超级项目的Git将
通常,子模块是一个(主要是)独立的存储库这一事实阻止了超级项目Git完全删除它。在这种特殊情况下,它可能应该
.git
目录吸收到超级项目之前,这实际上会破坏子模块存储库,这很不好。1在现代Git中,它不会(一旦子模块.git
目录至少被吸收),因此可以正常使用。
1
in的新分支上提交子模块; (2)退出子模块回到超级项目,并更新索引gitlink条目,以在子模块中记录新的哈希ID; (3)进行新的提交。现在,您有一个子模块提交,该提交未在任何地方推送,但可以并且应该在推送超级项目提交之前进行推送。现在已经完成了所有设置,您决定看一下历史性提交。您在超级项目中git checkout <hash>
,并且历史记录提交[[没有
submodule.recurse
设置为true
或已使用git checkout --recurse-submodules
,以便超级项目将子模块带入正确的(缺少)提交,然后删除子模块。因为.git
目录的字面意思是存在于子模块in
.git
目录本身位于其他地方,从超级项目的工作树中删除子模块不会损害子模块repository
。所以现在,这种清除将很安全。将超级项目还原到最新提交,可以简单地还原子模块的工作树,检出由子模块的存储库的分支进行GC保护的提交(仍未推送)。以上是关于Git在添加主存储库之前恢复主存储库后未删除子模块的主要内容,如果未能解决你的问题,请参考以下文章