gpt4 book ai didi

git - 黑白之间的差异'git submodule update'和'git pull'

转载 作者:太空狗 更新时间:2023-10-29 13:59:08 24 4
gpt4 key购买 nike

“git submodule update”和进入git子模块目录并对每个目录执行“git pull”之间有什么区别(如果有的话)?
谢谢

最佳答案

这是有区别的。另外,我会注意到,我刻意避免使用子模块(也称为sobmodules,理由很充分:它们会让用户非常难过,或者沮丧,或者两者兼而有之)。
子模块是一个单独的git repo
为了区分“主”或“超级项目”和每个“子模块”,我们将顶层称为超级项目。当我们将子项目、子模块或子存储库作为存储库使用时,它们都只是“子repo”。
超级项目是一个普通的git存储库。它像往常一样有分支,并且提交在分支上(可选地提交不在分支上,等等)。它还为每个子模块记录了一些信息:
子模块存储库的url
子模块存储库的路径
子模块的提交ID
前两项存储在.gitmodules中,这是超级项目工作树顶部的普通文件,格式为git config文件(如$HOME/.gitconfig.git/config)。.gitmodules文件还可以包含每个子模块的附加信息,但前两项是必需的。
第三项commit id作为“gitlink”类型的文件存储在存储库中。这是在更改要用于特定子模块的提交时更新的文件。
为了便于描述,假设超级项目在路径libbiglibsmall下有两个子模块libs/biglibs/small。因此,您将得到一个路径为.gitmoduleslibs/biglibs/small。url可以是任何内容,这取决于libbiglibsmall的上游存储库的位置。
同时,git将在您的超级项目中记录一个名为libs/big的“文件”,其内容为1a987f1356...或其他内容,另一个名为libs/small的“文件”,其内容是另一个丑陋的sha-1散列。
每个子模块都处于“分离头”状态
当您克隆并签出超级项目时,您还没有子模块的存储库,只有.gitmodules文件和存储的提交id。使用git submodule update将把存储库克隆到适当的目录中。然后,它将检查由gitlink条目标识的特定提交。
这使得每个子回购都处于“独立头”状态。
(即使对于所有较新的“分支”模式,情况似乎也是如此,尽管我还没有尝试过这种方式。)
git pull=git fetch+git something
实际上,运行git pull只是运行一个有限的git fetch,然后运行另一个git命令:要么git merge要么git rebase。哪个远程用于获取步骤,哪个分支用于合并或重新定位步骤,由当前分支控制。这两个设置的值组合起来构成当前分支的上游设置:如果当前分支是$branch,则上游是$remote/$merge,其中$remote是运行git config --get branch.$branch.remote时的输出,而$merge是运行git config --get branch.$branch.merge时的输出。
由于您的子回购处于“头分离”状态,其“当前分行”为“无分行”,也称为特殊匿名分行。根据定义,这既没有远程设置,也没有合并设置。git config --get命令将失败。
提取步骤仍然可以工作,因为git默认为从origin中提取。不过,合并或重新定位步骤将不得不失败。因此git pull不会有多大好处。
git submodule update完全做其他事情
它的功能是高度可配置的,所以see the documentation。一般来说,如果未配置,它只进行任何必要的初始化。而且,一般来说,它不会将子模块放在分支上:即使它基于分支名称更新子模块,它仍然会使子模块处于“分离头”状态。
扼要重述
子模块背后的一般思想是,您不关心分支,只关心原始提交id。每个子模块都说“从这个特定的存储库中获取这个特定的提交”,其中提交id记录在超级项目的“gitlink”条目中,子repo的url记录在超级项目的.gitmodules文件中。因此,提交id和url包含在超级项目中的提交中:id通过gitlink“文件”,url通过.gitmodules文件。
要将某个子模块指向另一个提交id,只需(哈哈)在子模块本身中签出新id,然后进入超级项目并将新id“git add”到相应的gitlink中。使用git submodule add可以完成第二步。您几乎可以很容易地手动执行第二步(例外情况是,由于文件名完成在路径中留下“/”号,因此很容易或至少以前很容易以错误的方式键入操作)。一旦更新了所有子模块,然后“git commit”结果以在超级项目中进行新的commit,记录新的gitlink散列。
所有关于git submodule的烦扰都是为了完成上述两个步骤(将git commit步骤留给您手动完成)。

关于git - 黑白之间的差异'git submodule update'和'git pull',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38109608/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com