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

如何将Git仓库子文件夹转为submodule并保留原名与提交历史

解决方案

注意:操作前请务必对原仓库做完整备份,避免误操作导致数据丢失。

1. 导出子文件夹为独立Submodule仓库(保留完整历史)

你可以通过git filter-repo工具提取指定子目录的所有提交历史,生成独立的Git仓库:

  • 克隆原仓库到本地临时目录,分别为两个子文件夹各做一次克隆操作:
    git clone <原仓库地址> temp_subfolder1
    git clone <原仓库地址> temp_subfolder2
    
  • 进入temp_subfolder1目录,执行命令提取subdirectory1/subfolder1的完整历史:
    git filter-repo --subdirectory-filter subdirectory1/subfolder1
    执行完成后,该目录下的内容就是原subfolder1的所有文件,且保留了所有关联的提交记录。
  • 同理进入temp_subfolder2目录,执行命令提取subdirectory1/subfolder2的完整历史:
    git filter-repo --subdirectory-filter subdirectory1/subfolder2
  • 将两个提取完成的独立仓库分别推送到你准备好的远端Git地址,作为Submodule的远端仓库。

2. 在原仓库中替换为同名Submodule

回到原仓库的本地根目录,确保工作区无未提交修改后执行以下操作:

  • 移除原路径下的两个子文件夹并提交变更:
    git rm -r subdirectory1/subfolder1 subdirectory1/subfolder2
    git commit -m "移除原内部子文件夹,准备替换为Submodule"
    
  • 添加同名Submodule,路径保持和原来的子文件夹路径完全一致:
    git submodule add <subfolder1远端仓库地址> subdirectory1/subfolder1
    git submodule add <subfolder2远端仓库地址> subdirectory1/subfolder2
    
  • 提交Submodule相关变更并推送到远端:
    git add .gitmodules subdirectory1/subfolder1 subdirectory1/subfolder2
    git commit -m "替换subfolder1、subfolder2为同名Submodule"
    git push
    
    这一步完成后,子文件夹名称完全和原来一致,且每个Submodule的历史都独立完整保留。

3. 切换旧提交的兼容方案(无需重命名文件夹)

你担心的切换到Submodule改造前的旧提交出现异常的问题,不需要通过重命名文件夹解决,按照以下流程操作即可:

  • 需要切换到改造前的旧提交前,先执行命令临时卸载所有Submodule:
    git submodule deinit --all
  • 再切换到对应旧提交,即可正常查看原路径下的文件内容,无冲突问题
  • 需要切回最新版本时,切换完成后执行命令恢复Submodule内容即可:
    git submodule update --init --recursive

Git Extensions 对应图形化操作说明

以上所有命令操作都可以在Git Extensions中通过图形界面完成,无需手动输入命令:

  • 提取子目录历史:在顶部菜单选择「工具」->「Filter repository」,选择子目录过滤规则,填入对应子目录路径即可完成历史提取
  • 添加Submodule:在右键菜单选择「Submodules」->「Add submodule」,填入对应远端仓库地址和本地路径(保持原子文件夹路径即可)
  • 卸载/更新Submodule:在右键菜单「Submodules」分类下可以找到「Deinit all」、「Update all」对应选项,直接点击即可执行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 20:24:02