git-svn
新版本git中已经集成git svn工具,可以用于git和svn之间的转换,在git bash中可以通过 git svn –help 查看相关命令的说明。
git迁移至svn
具体操作
- 在svn中建立相关目录
在git环境里初始化svn
$ git svn init svn://ip:port/xxx
获取svn上的更新
$ git svn fetch
会得到svn的分支名
r4178 = 1242a1de3082443e16594af0ea276024e49332b4 (refs/remotes/git-svn)
提交Git项目到svn
$ git svn dcommit
==注意:这个时候git会提示==
Unable to determine upstream SVN information from HEAD history.
Perhaps the repository is empty. at /usr/local/git/libexec/git-core/git-svn line XXX.
原因分析
因为现在Git 项目的commits不知道要放到SVN 项目的哪个版本之后,即Git 项目的这些提交要放在SVN哪个版本之后。
This fails since the git svn command can’t figure out which commits to push: there’s no link between our original Git repository and the Subversion heads.
To fix this, we can use a Git graft to link them. We’ll tell Git the commit which created the SVN folder in which we want to store the project is the parent commit of the first commit in our Git repository.
解决方案:
显示svn提交分支的版本号
$ git show-ref git-svn
1242a1de3082443e16594af0ea276024e49332b4 refs/remotes/git-svn
显示git提交的版本号
$ git log –pretty=oneline master | tail -n 1
b08ed4406c1feaffb7baf4057d18401e40882fbe 第一次提交
将版本信息输出到.git/info/grafts文件,目的是告知svn 将b08ed4 版本放置在1242a1版本后
$ echo “b08ed4406c1feaffb7baf4057d18401e40882fbe 1242a1de3082443e16594af0ea276024e49332b4” >> .git/info/grafts
提交git代码至svn
$ git svn dcommit
SVN迁移到Git
克隆SVN仓库。
$ git svn clone -s URL/project project
将SVN仓库的更新同步到Git
$ git svn rebase
创建git忽略文件 .gitignore
$ git svn create-ignore
提交svn冲突解决
如果你正在提交的文件在svn服务器上已经被别人改过,就会发生提交冲突。通常解决方法如下:
1. 首先使用git-svn rebase获取svn服务器上的最新冲突文件,比如:README.md,这将导致与本地README.md冲突,不过此时svn版本信息已经添加到本地git库中(通过git log可以查看),git-svn rebase提示你在解决README.md的冲突后,运行git rebase –continue完成rebase操作
2. 打开 README.md,修改文件,解决冲突
执行git rebase –continue,git提示:You must edit all merge conflicts and then mark them as resolved using git add
3. 执行git add README.md,告知git已完成冲突解决
4. 再次执行git rebase –continue,提示”Applying: git xxx”,此时”git xxx”版本又一次成功加入本地版本库,可通过git log查看;
5. 执行git-svn dcommit将 README.md 的改动同步到svn中心库,到此算是完成一次冲突解决。