git svn实战

我之前写了几个wordpress插件,比如inline-javascript, code-prettify。这些插件都托管在wordpress.org提供的svn服务器上,但是我实在太喜欢在git下活动了,因此动了点心思,想把插件代码传到github上,开发完之后利用git-svn传到wordpress的svn服务上。

照着这个思路,捋起袖子就开干了。

用git-svn抓取插件代码

wordpress的插件svn库大且缓慢,如果直接用git-svn去clone代码,一定会慢死,所以我按照以前的笔记,用git从大型svn快速clone代码

以code-prettify插件为例,首先需要读取这个插件创建时的版本号

svn log http://svn.wp-plugins.org/code-prettify|tail -4|head -1

得到了如下信息,获得一个版本号 318479

r318479 | plugin-master | 2010-12-03 20:12:29 +0800 (五, 03 12 2010) | 1 line

开始clone代码

git svn clone -s --prefix=svn/ -r318479:HEAD http://svn.wp-plugins.org/code-prettify

设置git仓库

首先把代码传了一份到github: https://github.com/volca/code-prettify

然后操作本地git仓库

git branch -m svn
git remote add origin git@github.com:volca/code-prettify.git
git checkout master

本地svn分支对应svn的远程仓库,本地master分支对应github的远程仓库

Happy time

现在可以按照平常的习惯在git下更改代码,然后用git push到github上。

如果需要更新代码到svn上,按这个流程操作就可以了:

git checkout svn
git merge master
git svn dcommit

如果需要发布wordpress插件的新版本,这个在svn里就是一个打tag的过程,用git-svn操作非常简单,下面的例子表示发布code-prettify插件的0.3版本:

git svn tag 0.3

用git从svn里clone最后几个版本

一般情况下git svn clone这个操作会从第一个版本开始同步,如果版本号已经到了好几万(或更高?),这个操作会相当的费时。

当时还想着能不能hack一下git-svn脚本,其实后来看看文档,clone操作可以使用参数-r$REVNUMBER:HEAD检出指定版本后的代码,因此,更好的步骤应该是这样:

    • svn info http://your-svn, 并记录最后的版本号,假设是260
    • 假设要检出最后10个版本,做个简单的减法: 260 – 10 = 250
    • 开始clone操作了
      git svn clone -r250:HEAD --prefix=svn/ http://your-svn

按这个办法,clone的时间的确是减少了许多。

Git-svn on cygwin

开始试用最近比较红的git,我看中的是它的本地版本库功能,即便网络比较烂的时候,也可以在本地提交,等到了合适的时候一并传上去。由于以前的代码版本控制使用的是svn,所以我用git-svn过渡一下。

目前在windows下,最好的git客户端恐怕就是装一个cygwin。鼓捣了一个时辰,整理好一些可用的配置文件,陈列一下以备下次使用:

~/.bash_profile

偶尔还会使用svn验证一下check in的情况,刚转过来不放心啊,下面的配置是为了防止svn命令行乱码。命令行git-svn在/usr/sbin/git-core/路径下,是一个perl脚本,为了方便,我把这个路径加入了PATH环境变量。

export PATH=$PATH:/usr/sbin/git-core/
export SVN_EDITOR=vim
export LC_ALL=en_US.UTF-16
export LC_CTYPE=en_US.UTF-16
export LANG=en_US.UTF-16
export XMODIFIERS=@im=Chinput3
stty cs8 -istrip
stty pass8
export LESSCHARSET=latin1

~/.inputrc

去掉注释即可


set meta-flag on
set convert-meta off
set input-meta on
set output-meta on

~/.gitconfig


[user]
name = muhaha
email = aa@bb.cc

[color]
diff = auto
status = auto
branch = auto

[alias]
st = status
rb = svn rebase
ci = commit -a
co = checkout

常用操作

clone一个svn git svn clone -s svn://xxx.xxx.com
类svn up操作? git svn rebase
添加文件 git add xfile
check in git ci
往svn库提交 git svn dcommit