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

Git Submodule操作咨询:克隆及子模块更新同步流程

我太懂这种被迫用Git Submodule的痛苦了——之前一直绕着走,突然被项目架在火上烤的感觉真的糟。结合你的环境限制(生产环境没Composer/Drush、权限受限、只用fetch+merge、非裸仓库),我给你整理一套精准的操作流程,解决你的两个问题:

1. 克隆父仓库到生产环境,完整包含所有已检出子模块

核心是让生产环境一次性拉取父仓库和所有子模块的当前状态,具体步骤:

  • 生产环境执行克隆命令:直接用递归克隆参数,一次性拉取父仓库和所有子模块
    git clone --recurse-submodules <开发服务器父仓库地址> /myproject
    
  • 如果克隆时忘了加--recurse-submodules,可以事后补操作:
    cd /myproject
    # 初始化子模块配置
    git submodule init
    # 根据父仓库记录的commit哈希,检出对应子模块版本
    git submodule update
    
    执行完后,生产环境的仓库结构就和开发服务器完全一致了。

2. 开发端修改子模块后,生产端通过父仓库同步(不从子模块远程拉取)

这里的关键逻辑是:子模块的变更必须先提交到子模块仓库,再更新父仓库的子模块引用并推送,生产端只需要同步父仓库的变更,就能触发子模块的更新,全程不需要生产端直接操作子模块远程:

开发环境操作流程:

  1. 修改并提交子模块变更:
    cd /myproject/other/submodule
    # 编辑文件完成后,提交到子模块本地仓库
    git add .
    git commit -m "修复子模块XX功能"
    # 把子模块的提交推送到它的远程仓库(比如开发服务器上的子模块仓库)
    git push origin <子模块使用的分支名>
    
  2. 更新父仓库的子模块引用:
    cd /myproject
    # 此时git status会显示other/submodule有变更(因为子模块的commit哈希变了)
    git add other/submodule
    git commit -m "更新子模块到commit [这里可以写子模块commit的前6位哈希]"
    # 把父仓库的变更推送到远程(开发服务器的父仓库)
    git push origin <父仓库使用的分支名>
    

生产环境操作流程:

  1. 同步父仓库的最新变更(用你们习惯的fetch+merge):
    cd /myproject
    git fetch origin
    git merge origin <父仓库使用的分支名>
    
  2. 更新子模块到父仓库指定的版本:
    git submodule update
    
    这个命令会自动根据父仓库刚同步的子模块commit哈希,切换子模块到对应版本,不需要生产端主动去子模块远程拉取——因为父仓库已经明确指定了要使用的子模块版本,Git会自动处理本地切换(如果本地没有该commit,才会从子模块远程拉,但只要开发端已经把子模块提交推送到远程,这个拉取是自动且必要的,而且是通过父仓库的操作触发的,符合你的要求)。

关键注意事项:

  • 每次子模块有变更,必须更新父仓库的子模块引用并提交,否则父仓库不会记录子模块的新版本,生产端同步父仓库也不会拿到子模块的变更。
  • 如果生产环境执行git submodule update时提示找不到commit,说明开发端没把子模块的提交推送到远程,回去检查开发端的子模块push步骤。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:43:53