Todays保持git子模块签出与commit-IDs同步的策略?

问题描述 投票:6回答:1

StackOverflow上有很多关于自动更新子模块的问题,包括。

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

所以,既然git每天都在变化,我敢再问一次。

有没有一种(方便的)方法 启动自动更新 的子模块签出(即与相应的子模块提交ID保持同步)。checkout pull (即 mergerebase)?

目前我有两种方法。

#1:创建一个 post-checkout, post-mergepost-rewrite 钩子的内容如下

#!/bin/sh
git submodule update --init --recursive

正如你已经看到的,这种方法有几个缺点。

  • 它的 复杂的 并且可能需要一个脚本来使其可靠地工作。
  • 如果你 已经使用这些git-hooks
  • 提交钩子只在活动状态下使用 在这个克隆体上 (必须由每一个从事这个项目的人在每一个克隆上重做)
  • 设置为 非标准 贻误战机

#2: 配置别名为 pullcheckout

git config --global alias.up 'pull --recurse-submodules'
git config --global alias.co 'checkout --recurse-submodules'

但这也不是什么好事。

  • 它不会 --init 的子模块(可以通过运行 pullcheckoutsubmodule update 分别
  • 非标准 而不能与脚本和代码集一起使用。
  • 懒得用 upco 而不是 pullcheckout
  • 行得通 只在本地 机器用户

如果你能做到像这样的方法,这种方法就会更像我想要的那样。

git config --global pull.recurseSubmodules true
git config --global pull.initSubmodules true
git config --global checkout.recurseSubmodules true
git config --global checkout.initSubmodules true

......但你不能,是吗?

git git-submodules git-pull git-checkout git-config
1个回答
1
投票

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 checkout --recurse-submodules <branch> 当当前分支没有子模块并且 <branch> 已初始化嵌套的子模块前失败。Git 2.27.

© www.soinside.com 2019 - 2024. All rights reserved.