git学习——svn代码同步到git(3)
git svn 同步
最近接手的项目代码放在svn,但是svn推送分支的代价太高了,每个分支目录都是一次全拷贝,所以项目转用git进行版本管理。
最傻的方法是新建git分支,将svn的代码作为源代码重新提交,但是这种方法没办法获取到svn的commit记录,这对版本追踪是不可忍的。所以放弃。
第二种方式,是将svn的分支连同commit记录一起merge到git,然后再用git进行版本管理。
参考资料:
1、http://blog.csdn.net/ouyang_peng/article/details/76220621
使用场景 :将已有的SVN项目迁移至git
场景一: 从旧SVN项目同步代码至新的git项目
注意:
该步骤只有第一次迁移的时候才需要做,一旦迁移成功,所有svn的代码都应该由git更新,不应该直接在svn上提交,否则版本库会乱
具体步骤
1、 在git 创建对应的project
2、 clone git项目
3、 在.git/config中添加svn-remote,创建命令如下。
[svn-remote "svn"]
url = http://svn.*****.com/***********/branches/release
fetch = :refs/remotes/git-svn-release
4、 第三步中创建了一个名为svn的git-svn同步分支,该分支为所有其他git分支连接SVN代码库的桥梁,只有当需要将代码同步至SVN时才会往该分支合代码。
5、 从空的svn远程库中做初始化fetch,并将其作为一个新分支checkout
git svn fetch svn
git checkout -b svn git-svn-release
6、git show-ref命令查看分支情况
到有个远程分支remotes/git-svn-release。
7、 假设我们所有的开发分支最后都要合到develop分支上,我们就用develop分支和同步分支做交互。
8、 checkout至develop分支,将svn分支merge进develop分支,这样SVN的代码库就原封不动连同日志一起在git中建立了起来。
git checkout develop
git merge svn --no-ff
git commit
场景二: 在已经使用git开发的情况下建立git到svn的同步机制
如果上述场景一已经做完,作为一个开发,我现在只能拉到develop分支,我如何建立起这么一套同步机制呢?
重做场景一中的前8步,这样使得我们本地有一个svn(和上面的并不是一个分支,没有联系),与之建立联系的是远程svn服务器上的git-svn分支
此时的develop分支和svn分支是两条从一个根节点出发的线,这个跟节点就是场景一中第一次将 svn merge入develop的这次提交。
虽然这两个分支最后当前的文件内容应该是相同的,但是git并不会这么认为,它会觉得这是两条截然不同的分支,为了能够让develop和svn建立起关系,需要再将develop和svn合并,把develop合入svn。
git checkout svn
git merge develop --no-ff
场景三,将改动提交到svn
已经建立git到svn的同步机制的情况下。
git checkout svn
git svn dcommit