如何将多个SVN trunk路径迁移至单个Git master且保留历史?
迁移多个SVN Trunk到单个Git Master分支的方法
作为经常处理SVN转Git迁移的人,我完全懂你遇到的痛点——git svn clone -s确实只适配标准单路径的SVN仓库,要把多个独立trunk合并到同一个Git分支,我们可以分步骤实现,同时完整保留所有历史记录:
步骤1:创建目标Git仓库
先搭一个空的Git仓库,作为最终整合所有SVN trunk的容器:
mkdir my-combined-git-repo cd my-combined-git-repo git init
步骤2:准备SVN作者映射(可选但推荐)
为了让Git提交记录的作者信息和SVN完全对应,先生成并编辑作者映射文件:
# 从任意一个SVN trunk导出所有作者列表 git svn log --xml http://your-svn-repo/path/to/trunk | grep -E "<author>" | sort | uniq | sed -e "s/<author>//" -e "s/<\/author>//" > authors.txt
然后编辑authors.txt,每行格式为:
svn-username = Full Name <email@example.com>
步骤3:逐个克隆并合并SVN Trunk
对每个需要迁移的SVN trunk,重复以下操作:
克隆单个SVN Trunk
# 回到上级目录 cd .. # 克隆当前SVN trunk,若准备了作者映射文件就带上参数 git svn clone --trunk=/path/to/svn/trunk --authors-file=authors.txt http://your-svn-repo svn-trunk-1
将克隆的trunk合并到目标Git仓库
cd my-combined-git-repo # 添加克隆的trunk作为临时远程仓库 git remote add trunk-1 ../svn-trunk-1 # 拉取该trunk的全部历史记录 git fetch trunk-1 # 如果是第一个合并的trunk,直接把当前master重置到该trunk的HEAD git reset --hard trunk-1/master # 如果是后续的trunk,执行合并(允许无关历史,因为不同SVN trunk的初始提交无关联) git merge trunk-1/master --allow-unrelated-histories
如果合并时出现文件冲突,手动解决冲突后执行git add .和git commit完成合并即可。
步骤4:清理与验证
所有trunk合并完成后,可以移除临时添加的远程仓库:
git remote remove trunk-1 git remote remove trunk-2 # 依此类推,移除所有临时远程
然后查看Git日志,确认所有SVN历史都被完整保留:
git log --oneline
这样就能把多个独立的SVN trunk的代码和历史,完整整合到同一个Git master分支里了。
内容的提问来源于stack exchange,提问作者user2128849
相关产品推荐
相关产品推荐

