You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins使用GitSCM checkout时如何仅拉取指定的git submodule?

Jenkins Pipeline 实现方案

方案1:通过GitSCM内置的submoduleCfg参数指定拉取范围

你之前留空的submoduleCfg参数就是用来配置指定子模块的,修改后的配置如下:

checkout([
    $class: 'GitSCM',
    branches: [[name: 'develop']],
    doGenerateSubmoduleConfigurations: false,
    extensions: [[$class: 'SubmoduleOption',
        disableSubmodules: false,
        parentCredentials: true,
        recursiveSubmodules: false, // 关闭递归拉取所有子模块
        reference: '',
        trackingSubmodules: false]
        ], 
    submoduleCfg: [['name': 'submodule1']], // 仅拉取指定名称的子模块
    userRemoteConfigs: [[url: "git@git.myorg.com/project/repo.git"]]
])

如果需要拉取多个指定子模块,在submoduleCfg数组里追加即可,比如submoduleCfg: [['name': 'submodule1'], ['name': 'submodule3']]

方案2:关闭自动拉取子模块,手动执行命令拉取指定内容

这种方案灵活性更高,适合需要动态选择子模块的场景:

checkout([
    $class: 'GitSCM',
    branches: [[name: 'develop']],
    doGenerateSubmoduleConfigurations: false,
    extensions: [[$class: 'SubmoduleOption',
        disableSubmodules: true, // 关闭自动拉取所有子模块
        parentCredentials: true,
        recursiveSubmodules: false,
        reference: '',
        trackingSubmodules: false]
        ], 
    submoduleCfg: [], 
    userRemoteConfigs: [[url: "git@git.myorg.com/project/repo.git"]]
])

// 手动拉取指定子模块
sh '''
git submodule init submodule1
git submodule update submodule1
'''

Git 端原生实现方案

如果不修改Jenkins的checkout配置,也可以通过Git自带的子模块配置项禁用不需要拉取的子模块:

# 禁用不需要拉取的子模块
git config submodule.submodule2.update none
# 执行子模块更新,已禁用的子模块会自动跳过
git submodule update --init

如果后续需要恢复拉取submodule2,执行git config --unset submodule.submodule2.update即可。

场景优化建议

  • 优先选择手动执行Git命令的方案,可配合Jenkins构建参数动态选择要拉取的子模块,适配不同构建场景的需求。
  • 你当前示例中的两个子模块配置了完全相同的path,会导致拉取时互相覆盖,建议调整为不同的存储路径避免冲突。
  • 如果子模块体积较大,可配合Git稀疏检出(sparse checkout)使用,进一步减少拉取的文件体积,提升构建效率。

内容的提问来源于stack exchange,提问作者SHC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 21:42:02