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

如何基于JSON配置文件自动添加指定的Git submodules?

自动导入Git子模块实现方案

以下两种方案均适配全Windows开发环境,可直接落地使用:


方案1:PowerShell原生实现(推荐,无需额外安装工具)

Windows系统自带PowerShell原生支持JSON解析,无需额外安装jq等第三方工具,稳定性更高。

  1. 将你的配置文件命名为components.json放在项目根目录
  2. 在项目根目录新建add-submodules.ps1脚本,内容如下:
# 读取配置文件
$config = Get-Content "components.json" | ConvertFrom-Json
# 筛选version字段不为^的组件
$targetComponents = $config.components | Where-Object { $_.version -ne "^" }

foreach ($comp in $targetComponents) {
    $repoUrl = $comp.URL
    $targetPath = $comp."folder-name"
    $version = $comp.version
    Write-Host "正在处理组件:$($comp.name)"
    # 路径不存在才执行添加,避免重复报错
    if (-not (Test-Path $targetPath)) {
        git submodule add $repoUrl $targetPath
        # 可选:添加完成后自动切换到指定版本tag
        if ($version -ne "X") {
            git -C $targetPath checkout $version
        }
    } else {
        Write-Host "路径 $targetPath 已存在,跳过添加操作"
    }
}
  1. 在项目根目录右键打开PowerShell,执行.\add-submodules.ps1即可完成批量子模块导入。

方案2:JQ + Bat批处理实现

如果你更习惯使用批处理脚本,提前将jq可执行文件加入系统PATH后,使用如下脚本即可:

@echo off
setlocal enabledelayedexpansion

:: 用jq筛选符合条件的组件,拆分字段遍历
for /f "tokens=1,2,3 delims=|" %%a in ('jq -r ".components[] | select(.version != \"^\") | [.URL, .\"folder-name\", .version] | join(\"|\")" components.json') do (
    set repo_url=%%a
    set target_path=%%b
    set version=%%c
    echo 正在添加子模块到 !target_path!
    if not exist "!target_path!" (
        git submodule add !repo_url! !target_path!
        :: 可选:切换到指定tag版本
        if not "!version!"=="X" (
            git -C !target_path! checkout !version!
        )
    ) else (
        echo !target_path! 已存在,跳过添加
    )
)
pause

补充说明

  • 如果需要处理已存在的子模块,可以新增逻辑判断:子模块已存在时直接执行git pull拉取对应版本更新,无需重复添加
  • 可按需扩展配置字段,比如新增parent-path字段自定义子模块统一存放的父目录,灵活度更高
  • 遇到子模块冲突时,可先执行git submodule deinit -f 目标路径清理旧配置后再重新运行脚本

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 16:06:04