git子模块更新“no-fetch”

时间:2015-03-24 22:53:21

标签: git git-submodules

当我发布子模块更新并包含" - no-fetch"像这样:

git submodule update --remote --no-fetch

documentation州:

  

为了确保当前跟踪分支状态,请更新--remote   在计算之前获取子模块的远程存储库   SHA-1。如果您不想获取,则应使用子模块更新   --remote --no-fetch。

我对" - no-fetch"感到有些困惑。部分。如果我在没有它的情况下调用更新:

git submodule update --remote

我知道不会执行提取 - 但这也意味着我无法保证" 当前跟踪分支状态" ?究竟是什么意思?

在什么情况下我不想保证当前跟踪分支状态

1 个答案:

答案 0 :(得分:0)

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(更新到记录在超级项目中的提交)而无需访问网络。但是,这不会具有“当前跟踪分支状态”,因为您的远程跟踪分支只会与您上次获取时一样新。