当我克隆我的git repo时,其中一个子模块位于一个具有奇怪名称的分支中,我认为这意味着它具有“头分离头”(我什至不知道那是什么意思)。
如果我 checkout 子模块的主分支,然后运行“git submodule update --init --recursive
”,它将再次发生。
有人知道发生了什么吗?
最佳答案
git目录的内容存储在名为“trees”的简单文本文件 list (即目录列表)中,其外观如下所示,其中blob是文件的内容,而树是这样的更多树:
100644 blob 0c31be662540ce902cee106f86bfdeef519fc662 .gitignore
100644 blob 1d364edf530c2238e79162bf2d9f30c2af610347 .gitmodules
040000 tree fc6bc39202ec20228e9135cd426110c558b625cd foo
040000 tree 2f9fc460f3a2370ed45b39b2bcaaf9b6e746b823 bar
如果bar是一个子模块,而不只是一个目录,那么包含它的树将像这样列出:
100644 blob 0c31be662540ce902cee106f86bfdeef519fc662 .gitignore
100644 blob 1d364edf530c2238e79162bf2d9f30c2af610347 .gitmodules
040000 tree fc6bc39202ec20228e9135cd426110c558b625cd foo
040000 commit 2f9fc460f3a2370ed45b39b2bcaaf9b6e746b823 bar
请注意,它不再是树,而是现在是一个提交(在子模块中)。这是所有有关树/提交级别的子模块的git存储,因此它不知道提交在哪个分支上。实际上,存储分支名称是行不通的。他们可以改变。另外,如果您在仓库中 check out 了旧的提交,该提交又需要回滚子模块,那么分支是否应该移回子模块?这会将新分支位置之后的提交投到未引用的区域中。
这些分支供人类使用,理解DAG以及特定思路所在。 Git不在乎我们如何引用提交。它需要一个具体的位置,因此您可以安全地移动包含的存储库,并且知道子模块将始终被 check out 到当时的位置。唯一的事实是哈希。