保持 git 子模块结帐与提交 ID 同步的当今策略?

fra*_*ans 7 git git-pull git-config git-checkout git-submodules

StackOverflow 上提出了很多关于自动更新子模块的问题,包括:

但在我看来,对于 git 子模块,还没有单一的方法可以像svn up关于 svn-externals 一样工作。

所以既然git每天都在变化,我又敢再问:

有没有一种(方便的)方法来初始化自动更新checkout pull(即mergerebase)的子模块检出(即与其相应的子模块提交 ID 保持同步)?

目前我有两种方法:

#1: 创建一个post-checkout,post-mergepost-rewrite钩住以下内容

#!/bin/sh
git submodule update --init --recursive
Run Code Online (Sandbox Code Playgroud)

正如您已经看到的那样,这种方法有几个缺点:

  • 它很复杂,可能需要一个脚本才能使其可靠地工作
  • 如果您已经使用这些 git-hooks,则效果不佳
  • 提交挂钩仅在此克隆上处于活动状态(必须由在每个克隆上从事此项目的每个人重新完成)
  • 设置是非标准的,会混淆其他人

#2: 为pulland配置别名checkout

git config --global alias.up 'pull --recurse-submodules'
git config --global alias.co 'checkout --recurse-submodules'
Run Code Online (Sandbox Code Playgroud)

但这也不好:

  • 它不会--init是子模块(可以通过运行pull/checkoutsubmodule update分开来解决)
  • 它是非标准的,不适用于脚本和片段
  • 容易忘记使用 up/co而不是pull/checkout
  • 仅适用于本地机器/用户

如果你可以做一些类似的事情,这种方法会更像我想要的

git config --global pull.recurseSubmodules true
git config --global pull.initSubmodules true
git config --global checkout.recurseSubmodules true
git config --global checkout.initSubmodules true
Run Code Online (Sandbox Code Playgroud)

.. 但你不能,是吗?

phi*_*ilb 2

Git 2.13开始,您可以git checkout --recurse-submodules <ref>这样做,以确保活动子模块的工作树与超级项目中记录的子模块提交同步<ref>

Git 2.14开始,您可以执行git pull --recurse-submodules,这将执行正常的拉取,然后调用git submodule update --init --recursive--rebase如果您用 拉取--rebase),保持活动子模块工作树与超级项目中记录的子模块提交同步。

Git 2.15开始,设置git config submodule.recurse true将使其成为所有接受该--recurse-submodules标志的命令的默认行为,除了clonels-files

如果不更改配置或使用这些选项,则无法将此行为设置为默认行为。


请注意,在Git 2.27git checkout --recurse-submodules <branch>之前,当前分支没有子模块且<branch>已初始化嵌套子模块时执行的操作会失败。