虽然使用git的好处多多,不过由于一些历史原因我们在工作时可能还得使用SVN,那么有没有一种方法可以兼顾理想与现实呢?
git给我们提供了git svn命令工具,可以用使用git的方法来管理SVN代码。闲话不多说,正式开始我们的git svn使用教程。
创建仓库
- 只拉取单一目录:
git svn clone http://xx.xx.xx.xx/trunks/demo
- 拉取服务器上全部数据:
git svn clone http://xx.xx.xx.xx/demo -T your_trunk -b your_branches -t your_tags
如果SVN服务器上的目录结构为标准目录即trunk、tags、branches,可直接用
git svn clone -s http://xx.xx.xx.xx/demo
如果历史记录太多不需要全部读取下来可以加参数-r1000:HEAD
,只会拉取从1000版本到当前版本的历史更改记录。
耐心等待下载完成。
如果SVN库中有镜像目录,git svn无法自动读取下载导致git库内容不全时,可参考 git库中引用文件夹/文件
git库操作
下载完成后就可以使用正式使用git命令,复习下常用git命令:
git status 查看仓库状态
git log 查看提交记录
git reflog 查看git操作记录
git add -A 添加需要提交的文件
git commit -m "我是注释" 提交已add的文件到仓库
git reset --hard HEAD 恢复所有修改的文件到最新版本
当然我们常常还需要处理代码冲突,git命令或Mac上的工具还是弱了些,这时就肯定要用到神器Beyond Compare,推荐使用Beyond Compare 4,实测Beyond Compare 3在处理git svn库代码有时不能正确合并。记得配置Beyond Compare为默认difftool/mergetool,配置说明参见:
http://www.scootersoftware.com/support.php?zz=kb_vcs
更新SVN代码
git svn rebase
提交git库中文件到SVN版本库
本地开发完后git commit到本地git库,之后可用如下命令提交文件到SVN:
git svn dcommit
其它技巧
使用git svn做SVN库中转站
由于网络等原因,一些计算机可能无法管理SVN库中代码,给我们的开发造成很大的不便。这时可以利用git库可进行离线版本管理的特点在本地建立git svn版本库,以此版本库做中转来解决版本管理问题。下面为一示例:
建立本地git仓库,D盘下建立目录名为deploy 的git仓库:
cd d:/
git svn clone svn://x.x.x.x/test deploy
建立开发仓库:
git clone d:/deploy dev_master
因为用git svn克隆的仓库不能使用bare设置为没有工作区的镜像库,所以在dev_master push时可能会有receive.denyCurrentBranch’ Configuration variable to refuse这样的提示,这是因为git默认不允许push到non-bare的库,可在deploy 目录下使用如下配置:
git config receive.denyCurrentBranch updateInstead
提交固定格式的注释
一些提交的注释可能需要固定的格式,在vi中键入i进入输入模式可较完整的粘贴注释内容,或搜索使用git commit 模板
用法。
git提交记录不能在SVN历史记录上显示
最简单的是在master分支上开发。如果出现提交记录不能显示可能有以下几个原因:
- 所提交记录在分支
如在dev分支上开发,用此保留提交记录
git rebase master
git checkout master
git merge dev
- SVN提交记录时区与git不同
查看SVN提交记录生成的时间的格式,提交时使用
git commit --date "custom date string"
如果已经提交,用amend命令:
git commit --amend --date "Mon May 30 12:00:30 2016 +0800" -c c3926b
//date中按正确的日期格式书写,c参数为commit-id,不是svn-id
用此方法提交在git库中时间为"custom date string",但是由SVN客户端查看为真实提交到SVN服务器端的时间。