Git子模块更新 "no-fetch"

9
当我发出子模块更新命令并包括“--no-fetch”时:
git submodule update --remote --no-fetch

文档显示:

为了确保跟踪分支状态,update --remote 会在计算SHA-1之前先获取子模块的远程仓库。如果您不想获取,请使用submodule update --remote --no-fetch。

我对“--no-fetch”部分有些困惑。如果我没有使用它,则:

git submodule update --remote

我知道fetch不会被执行,但这也意味着我不能保证一个“当前跟踪分支状态”?那具体是什么意思?
在什么情况下,我不想要一个“当前跟踪分支状态”的保证?
1个回答

1

git submodule update 在幕后执行了几个操作。从 git help submodule 可以看到:

通过克隆缺失的子模块、获取子模块中缺失的提交和更新子模块的工作树,来使已注册的子模块与超级项目期望的匹配。

因此,在子模块内运行 git submodule update --remote 大致相当于:

$ git fetch origin  # update remote-tracking branches
$ git checkout origin/HEAD  # update working tree

origin/HEAD是一个远程跟踪分支,它跟随来自远程仓库的分支(通常情况下它是隐藏的,但您可以使用git branch --remotes命令查看)。请注意,git fetch会产生网络活动,但git checkout完全在本地进行。

--no-fetch跳过了第一步,但仍会将您的子模块工作树更新到远程跟踪分支。

我认为没有常见的情况需要使用--no-fetch,但在网络连接有限的情况下,它可能最有用。例如,在您乘飞机之前,您可以运行git fetch --recurse-submodules命令。然后在飞行期间,您可以使用git submodule update --remote --no-fetch(更新到子模块的远程跟踪分支)或git submodule update --no-fetch(更新到超级项目中记录的提交)而不访问网络。但是这样做不会具有“当前跟踪分支状态”,因为您的远程跟踪分支只会与上次获取时一样新。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接