如何在git中添加可选的子模块?

cer*_*cem 8 git plugins git-submodules

当我们在git存储库中有很多(比如20个)子模块时,我们可以像这样安装(和更新)它们:

git submodules update --init --recursive 
Run Code Online (Sandbox Code Playgroud)

Git尝试在此命令后下载每个子模块(递归).如果我们想让一些子模块可选(如插件)怎么办?

我们怎样才能让git跳过默认下载这些可选子模块,并在我们标记这个子模块时处理为通常的子模块"好的,从现在开始使用"?

Sau*_*ari 1

一种方法是:

  1. 获取存储库的子模块列表
  2. 获取每个子模块的用户输入(是否更新)
  3. 排除用户选择的子模块,
  4. 更新子模块

要获取子模块列表并将其格式化为仅显示子模块路径:

git submodule--helper list | awk '{$1=$2=$3=""; print substr($0,4)}'
Run Code Online (Sandbox Code Playgroud)

排除子模块 X

git -c submodule."X".update=none submodule update --init --recursive
Run Code Online (Sandbox Code Playgroud)

将这两个命令与 xargs 和tr实用程序结合起来,并进一步使用命令替换,

git $(git submodule--helper list | awk '{$1=$2=$3=""; print substr($0,4)}' | xargs -pI % echo -c submodule.\"%\".update=none | tr '\n' ' '| xargs echo) submodule update --init --recursive
Run Code Online (Sandbox Code Playgroud)

xargs util 的交互模式允许用户选择要更新的子模块,即通过提供格式输入(y/n)。输入y表明子模块在更新期间被排除。输入n表示未采取任何操作。

笔记

  • 此处的子模块名称假定与其路径相同。但是,请查看此处以获取具有不同名称和路径的子模块名称。

  • 要(永久)排除或包含子模块 X,submodule."X".update应将该属性添加到本地 repo的 gitconfig 文件中。对于使用此命令在配置文件中submodule."X".update设置的排除none

     git config --local submodule."X".update none
    
    Run Code Online (Sandbox Code Playgroud)

    并使用此命令取消设置以包含在内

    git config --local --unset submodule."X".update
    
    Run Code Online (Sandbox Code Playgroud)
  • 要排除嵌套子模块,请按照此操作