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

如何从包含本地submodule提交的本地仓库创建分支/工作区

问题:Git工作区迁移后本地提交的Submodule无法同步

背景场景

  1. 仓库结构:克隆了project主仓库,将addon作为submodule嵌入,目录结构:
- project
--- addon
------ z.c
--- x.c
--- y.c
  1. 本地修改:在addon中修改文件后,已在addon子仓库和project主仓库完成本地提交,但所有变更未推送到远程。
  2. 需求:在其他位置创建project的独立工作区otherProject,要求包含主仓库当前所有文件,以及处于本地提交状态、保留完整历史的addon submodule。

执行操作及初始问题

执行命令:

git worktree add -b otherProject path/to/otherProject HEAD

新工作区的addon文件夹为空,submodule未同步本地状态。

已尝试的方法及问题

  • 执行git submodule update --recursive:失败,试图从远程origin拉取本地提交的submodule版本,报错:
error: Server does not allow request for unadvertised object 987e772b2...
fatal: Fetched in submodule path `addon`, but it did not contain  987e772b2...
  • 执行git checkout --recurse-submodules:无报错,但git status -uno提示:
Submodules changed but not updated:

Warn: addon doesn't contain commit 987e772b2...
  • 修改新工作区.gitmodules的URL为本地路径:无效,仍尝试从远程拉取。
  • 在新工作区addon目录执行git checkout:仅填充远程文件,不包含本地变更。

解决方案

方法1:直接关联本地submodule仓库

  1. 进入新工作区的addon目录,初始化git仓库:
cd path/to/otherProject/addon
git init
  1. 将原主仓库中addon的本地仓库设为远程源:
git remote add local /path/to/original/project/addon/.git
  1. 拉取本地提交并切换到目标版本(替换987e772b2为你的submodule提交哈希):
git fetch local
git checkout 987e772b2
  1. 返回新工作区根目录验证状态:
cd ..
git status -uno

此时submodule应处于正确的本地提交状态。

方法2:修改Git配置优先使用本地仓库

  1. 在新工作区根目录,指定addon submodule使用本地路径:
git config submodule.addon.url /path/to/original/project/addon/
  1. 执行本地submodule更新:
git submodule update --local

该方法会直接从原本地仓库同步submodule状态,无需重新初始化。

方法3:创建工作树时同步submodule

后续若需创建类似工作区,可在创建时携带--recurse-submodules参数:

git worktree add -b otherProject --recurse-submodules path/to/otherProject HEAD

注:该方法要求主仓库中submodule的本地提交在原仓库Git对象库中可访问,适合提前配置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 03:31:37