如果有的话,“git submodule update”和进入git子模块目录并在每个目录上执行“git pull”的区别是什么?
谢谢。
谢谢。
.gitmodules
中,它是超级项目工作树顶部的普通文件,格式为git config
文件(如$HOME/.gitconfig
和.git/config
)。.gitmodules
文件还可以包含其他信息,针对每个子模块,但前两个项目是必需的。libbig
和libsmall
,位于路径libs/big
和libs/small
下。因此,您将具有.gitmodules
,其中路径为libs/big
和libs/small
。 URLs可能是任何内容,取决于libbig
和libsmall
的上游存储库在哪里。libs/big
的“文件”,其内容为 1a987f1356...
或其他内容,以及另一个名为 libs/small
的“文件”,其内容为另一个大丑陋的 SHA-1 哈希值。
当您克隆并检出超级项目时,还没有子模块的仓库,您只有 .gitmodules
文件和存储的提交 ID。使用 git submodule update
将克隆存储库到适当的目录中。然后,它将检出由 gitlink 条目标识的特定提交。
这会将每个子存储库放入“分离 HEAD”状态。
(即使对于所有新的“分支”模式,似乎也是如此,尽管我没有进行实验。)
git pull
= git fetch
+ git something
运行 git pull
实际上只运行了一个有限的 git fetch
,然后是另一个 Git 命令:要么 git merge
要么 git rebase
。在 fetch 步骤中使用哪个远程分支以及在合并或变基步骤中使用哪个分支由您当前的分支控制。这两个设置的值组合起来构成了当前分支的 upstream 设置:如果当前分支为 $branch
,则其 upstream 为 $remote/$merge
,其中 $remote
是运行 git config --get branch.$branch.remote
命令输出的任何内容,$merge
是运行 git config --get branch.$branch.merge
命令输出的内容。
由于您的子仓库处于“分离 HEAD”状态,它的“当前分支”是“无分支”,也称为特殊的匿名分支。按定义,它既没有远程设置也没有合并设置。无论哪个 git config --get
命令都将失败。
由于Git默认从origin
获取,因此提取步骤仍然有效。但是,合并或变基步骤将失败。因此git pull
的作用不大。
git submodule update
完全是另一回事它具体做什么高度可配置,请参阅文档。通常情况下,如果未配置,则只需进行任何必要的初始化。总的来说,它不会将子模块放在分支上:即使它根据分支名称更新子模块,它仍然处于“分离的HEAD”状态。
.gitmodules
文件中。因此,提交ID和URL都包含在超级项目的提交中:通过gitlink“文件”记录ID,通过.gitmodules
文件记录URL。git submodule add
为您执行第二步。您几乎可以手动完成第二步(除了文件名自动补全在路径中留下“/”可能导致操作出现问题)。更新所有子模块后,您可以“git commit”结果以在超级项目中创建一个新的提交,记录新的gitlink哈希值。git submodule
的繁琐操作都是为了完成上述两个步骤(留下git commit
步骤需要手动完成)。