如何将RA仓库的后续提交历史Rebase至RB仓库并保留完整提交记录?
问题概述
现有两个同源Git仓库RA和RB,均从同一SVN仓库导出:
- RB保留了完整的库文件提交历史,最新提交停留在RA的导出节点,无后续提交
- RA在导出时将部分库提取为submodule,且导出后有一系列新提交(RA-a-b-c-d-e-f-g...)
需将RA导出后的所有提交线性Rebase到RB上,恢复“库作为代码一部分”的结构,同时保留完整提交历史(拒绝合并为单一提交或丢失历史关联)。此前操作出现大量<submodule-name>~<submodule-SHA>格式的冲突文件夹,且提交历史出现大量重复的库变更提交。
核心问题分析
- 直接Rebase未处理submodule与普通文件的结构差异:Git将RA中submodule的SHA引用变更视为普通文件修改,与RB中对应的库文件夹冲突,生成带SHA后缀的冲突目录
- RA的submodule提交与RB的库文件提交存在历史重叠,直接Rebase会重复导入SVN时期的库变更,导致提交冗余
解决方案步骤
步骤1:预处理RA,剥离submodule并转换为普通文件提交
先将RA的submodule结构转换为与RB一致的普通文件结构,消除结构差异:
# 克隆RA到临时仓库,避免污染原仓库 git clone ../RA ra-temp cd ra-temp # 切换到RA导出后的初始节点(即与RB HEAD一致的SVN导出版本) # 若RA的初始提交为SVN导出转submodule的版本,需切换到该提交的父节点: # git checkout $(git rev-parse HEAD^) git checkout <RA导出初始节点SHA> # 创建无submodule的新分支 git checkout -b no-submodules # 遍历所有submodule,将内容合并到主仓库 git submodule foreach ' SUB_PATH=$path SUB_SHA=$(git rev-parse HEAD) SUB_URL=$(git config remote.origin.url) # 回到主仓库目录 cd .. # 删除submodule占位文件及配置 rm -rf $SUB_PATH rm .gitmodules git add .gitmodules # 克隆submodule并检出对应版本,复制内容到主仓库路径 git clone $SUB_URL temp-sub-dir cd temp-sub-dir git checkout $SUB_SHA cp -r . ../$SUB_PATH cd .. rm -rf temp-sub-dir # 暂存合并后的文件 git add $SUB_PATH ' # 提交submodule合并后的初始状态 git commit -m "Convert submodules to local files (match RB structure)" # 将RA导出后的所有新提交Rebase到这个无submodule的分支上 git rebase --onto no-submodules <RA导出初始节点SHA> master
步骤2:将处理后的RA分支Rebase到RB
回到RB仓库,将预处理后的RA分支线性Rebase到RB的master分支:
cd ../RB # 添加处理后的RA临时仓库作为远程 git remote add ra-processed ../ra-temp git fetch ra-processed # 执行Rebase,将RA的新提交应用到RB的HEAD上 # 若出现冲突,仅需处理业务代码差异(结构已统一,无submodule冲突) git rebase --onto master ra-processed/no-submodules ra-processed/master
步骤3:清理与验证
- 完成Rebase后,删除临时远程和仓库:
git remote remove ra-processed && rm -rf ../ra-temp - 验证提交历史:
git log --oneline确认历史线性且无重复的库变更提交 - 验证文件结构:检查原submodule路径已恢复为普通文件夹,无
~SHA格式的冲突目录
关键说明
- 预处理阶段通过将submodule内容合并到主仓库,消除了RA与RB的结构差异,从根源避免submodule冲突
- Rebase时仅应用RA导出后的业务变更提交,不会重复导入SVN时期的库历史,保留了原SVN导出的整洁提交链
- 若遇到Git LFS相关问题,可在预处理RA时执行
git lfs install && git lfs fetch --all确保大文件完整拉取
内容的提问来源于stack exchange,提问作者Dequilla
相关产品推荐
相关产品推荐

