Git 仓库迁移到 SVN 仓库
法一
使用 git svn clone
建立本地 Git 仓库到 SVN 仓库的连接。
在 SVN 仓库中创建托管文件夹
首先在 SVN 中创建一个项目文件夹,用于托管 Git 仓库中分支中的代码。
svn mkdir "svn://localhost:1234/svn/project" -m "create project folder"
此时 SVN 中的提交日志为:
svn: cpf
创建中转仓库
初始化一个 Git 仓库,并将 SVN 中预先创建的项目文件夹克隆同步到中转仓库。
git svn clone "svn://localhost:1234/svn/project" "svn2git"
中转仓库链接迁移的 Git 仓库
cd "svn2git"
git remote add bridge "P:\temp\git repo"
git fetch bridge
此时中转仓库存在两条分支:
# SVN仓库中的分支,记录SVN仓库的提交记录
master: cpf
# 被迁移的Git仓库分支,记录Git仓库的提交记录
bridge/master: A --- B --- C
合并中转仓库中的提交记录
创建 Git 仓库的工作副本 (bridge/master) 并将其历史记录 (import) 放在 SVN 文件夹的历史记录 (master) 之上。
git checkout -b import bridge/master
git rebase -i master
合并后的分支:
master: cpf
import: cpf --- A --- B --- C
bridge/master: A --- B --- C
注:可以在git rebase -i master
的时候编辑历史记录、过滤分支、重写提交等。
合并提交记录
将合并完成的历史记录同步到 master 分支上。
git checkout master
git merge --ff-only import
迁移 Git 仓库到 SVN 仓库
可以通过 git log
查看当前的分支的提交记录。
git svn dcommit --localtime
法二
使用 git svn init
建立本地 Git 仓库到 SVN 仓库的连接。
本地 Git 仓库链接 SVN 仓库
git svn init "svn://localhost:1234/svn/project"
拉取 SVN 仓库的更新
git svn fetch
拉取完成可以使用 git branch -a
看一下分支。
迁移 Git 仓库到 SVN 仓库
git svn dcommit --localtime
问题1:本地还有未提交的更改 —— git commit 提交下
问题2:head历史没有上游svn信息 —— 为其添加父级信息
-
git show-ref —— 记录下remote/git-svn的commit值,其实是远程项目分支的最后一次commit值[parentcommit]
-
git log --pretty=oneline master | tail -n 1 —— 记录下第一次commit值[localfirstcommit]
-
git replace --graft [localfirstcommit] [parentcommit] —— 设置父级commit
问题3:本地修改删除的文件夹,svn 上会保留空文件夹 —— 添加选项设置 --rmdir
- 实在没办法删除空文件夹,可以在svn服务上删掉后,本地git svn rebase。
- 需要原来文件夹中存在内容,然后删除内部文件及文件夹时,–rmdir才会生效,以前的空文件夹时不会自动删除 —— 这个可能也是为了保证svn可以添加空文件夹。
.gitignore处理
-
git svn show-ignore > ./git/info/exclude —— 这个好像是针对有svn忽略处理的情况,我们可以忽略这一步
-
将本地.gitignore文件里的内容添加到./git/info/exclude中 —— 具体配置内容可以网络上,或者如我一样直接使用visual studio自动生成的配置内容
-
删除本地的.gitignore文件 —— 这样避免svn项目中含有.gitignore文件
git svn rebase
- 拉取最新项目
- 建议每次commit之前拉取最新内容