常常在宽带网络情况不佳的时候,访问互联网上的SVN库是一件极其痛苦的事情,更别说要查看版本库的日志信息了。此时若是能够将远程版本库整个同步到本地,而后全部操做都在本地的版本库上进行,好处就不用多说了。幸运的是SVN已经提供了相应的功能,具体操做步骤以下:
1)在本地创建一个新的版本库:
svnadmin create D:\test
2)建立钩子文件pre-revprop-change.bat:(windows环境里是D:\test\hooks\pre-revprop-change.bat)
文件中只须要一行内容便可“exit 0”。
3)初始化同步操做:
svnsync init file:///D:/test <远程SVN库的URL>
(若是须要用户名/密码,则按提示输入。成功后命令行将输出信息:复制版本 0 的属性)
4)执行同步操做:
svnsync sync file:///D:/test
(若是须要用户名/密码,则按提示输入。若是远程SVN库数据较多,须要慢慢等待)
5)若是远程SVN库有了新的更新,只需重复执行步骤4便可。
--------------
如何将SVN仓库转换为Git仓库
按以下步骤操做就能够将SVN仓库完整的转换为Git仓库:
1) 将远程SVN仓库搬到本地(这一步主要是为了提升转换的速度,也能够忽略)
这里假设最终要转换的SVN仓库为file:///tmp/test-svn
2) 使用git svn clone命令开始转换
$ git svn clone file:///tmp/test-svn -T trunk -b branches -t tags
git svn clone 命令会把整个Subversion仓库导入到一个本地的Git仓库中。这至关于针对所提供的 URL 运行了两条命令git svn init加上gitsvn fetch。因Git须要提取每个版本,每次一个,再逐个提交。对于一个包含成百上千次提交的项目,花掉的时间则多是几小时甚至数天(若是你的SVN仓库是远程网络访问的,先执行上面第一步的操做仍是有点好处的。不过项目一般提交次数都很多,漫长的等待是少不了的啦,慢慢等吧)。
-T trunk -b branches -t tags告诉Git该Subversion仓库遵循了基本的分支和标签命名法则。若是你的主干(trunk,至关于Git里的master分支,表明开发的主线)、分支或者标签以不一样的方式命名,则应作出相应改变。因为该法则的常见性,可使用-s来代替整条命令,它意味着标准布局(s是Standard layout的首字母),也就是前面选项的内容。下面的命令有相同的效果:
$ git svn clone file:///tmp/test-svn -s git
本例中经过 git svn 导入的远程引用,Subversion的标签是看成远程分支添加的,而不是真正的Git标签。导入的Subversion仓库仿佛是有一个带有不一样分支的tags远程服务器。用“$ git show-ref”就能够看到转换后Git仓库的相关状况,结果相似以下: windows
$ git show-ref
1cbd4904d9982f386d87f88fce1c24ad7c0f0471 refs/heads/master
aee1ecc26318164f355a883f5d99cff0c852d3c4 refs/remotes/my-calc-branch
03d09b0e2aad427e34a6d50ff147128e76c0e0f5 refs/remotes/tags/2.0.2
50d02cc0adc9da4319eeba0900430ba219b9c376 refs/remotes/tags/release-2.0.1
4caaa711a50c77879a91b8b90380060f672745cb refs/remotes/tags/release-2.0.2
1c4cb508144c513ff1214c3488abe66dcb92916f refs/remotes/tags/release-2.0.2rc1
1cbd4904d9982f386d87f88fce1c24ad7c0f0471 refs/remotes/trunk
而普通的 Git 仓库是相似以下模样:
$ git show-ref
83e38c7a0af325a9722f2fdc56b10188806d83a1 refs/heads/master
3e15e38c198baac84223acfc6224bb8b99ff2281 refs/remotes/gitserver/master
0a30dd3b0c795b80212ae723640d4e5d48cabdff refs/remotes/origin/master
25812380387fdd55f916652be4881c6f11600d6f refs/remotes/origin/testing
这里有两个远程服务器:一个名为gitserver,具备一个master分支;另外一个叫origin,具备master和testing两个分支。
3) 获取SVN服务器的最新更新到转换后的Git仓库(这步一般在连续的转换过程当中就不必了)
$ git svn rebase
4) 转换SVN仓库的svn:ignore属性到Git仓库的.gitignore文件
$ git svn create-ignore
该命令自动创建对应的.gitignore文件,以便下次提交的时候能够包含它。若是在生成.gitignore文件前想先查看一下,运行命令“git svn show-ignore”便可。
5) 转换SVN的标签为Git标签
$ cp -Rf .git/refs/remotes/tags/* .git/refs/tags/
$ rm -Rf .git/refs/remotes/tags
该命令将本来以 tag/ 开头的远程分支的索引变成真正的(轻巧的)标签。
这个在Window下试过不行,报”cp: cannot stat `.git/refs/remotes/tags/*': No such file or directory“的错误,可使用以下两个标准命令处理:
$ git tag tagname tags/tagname ----用指定的分支建立一个Git标签
$ git branch -r -d tags/tagname ----删除指定的远程分支
6) 转换SVN的分支为Git分支
$ cp -Rf .git/refs/remotes/* .git/refs/heads/
$ rm -Rf .git/refs/remotes
该命令把refs/remotes下面剩下的索引变成Git本地分支
7) 最后把转换后的本地Git仓库推到公共的Git服务器
$ git remote add origin [远程Git服务器地址]
$ git push origin master --tags
全部的标签和主干如今都应该整齐干净的躺在新的Git服务器里了。若是要将分支也同步到远程Git服务器,将--tags改成--all。服务器