delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

10 Jan 2011

git配合svn的一些使用方法

作弊条

在一个git库中跟踪不同的svn branch

首次创建git库:git svn clone [svn代码库到HEAD分支的URL] [git代码库名]

例如,对于 FreeBSD,对应的URL为 http://svn.freebsd.org/base/head/

一般来说,从远程svn库复制需要的时间会比较长,也可以考虑首先在本地建立一份镜像,然后直接用 file:/// 去指定。

接下来编辑 .git 中的 config 文件,找到类似:


[svn-remote "svn"]
        url = file:///downloads/mirrors/freebsd/base/head
        fetch = :refs/remotes/git-svn

对于不同的分支,可以继续添加新的svn-remote小节,例如:


[svn-remote "svn-releng-8.2"]
        url = file:///downloads/mirrors/freebsd/base/releng/8.2
        fetch = :refs/remotes/git-svn-releng-8.2

添加完之后,用git svn fetch svn-releng-8.2这样的命令来同步对应的分支。

本地开发分支

本地开发分支比较简单,只需git checkout -b [你的分支名字] [源分支]即可。

远程开发分支

如果需要在另一个系统上做开发,则需要一些特别的步骤。

首先是git clone远程系统上的代码库。然后编辑.git/config,其中应该有类似这样的部分:


[remote "origin"]
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = server:/repo/freebsd.git

为svn的branch建立对应的remote:


[remote "svn"]
        fetch = +refs/remotes/*:refs/remotes/svn/*
        url = server:/repo/freebsd.git

然后git pull,在git branch -r时就能看到远程系统上的git-svn branch了。这个主要是在git merge的时候比较有用。


Archived: 5 Comments

marshalys | January 18, 2011 12:36 AM

老大,一段时间没来看,你的那个mars有段时间没更新了啊,我原来可是每天都看你的那个mars的啊,啥时候能恢复更新啊……

ambrosehua | February 10, 2011 4:57 AM

老大,你说的先建一份镜像是什么意思,能否说的更清楚些?
这个镜像是用
git svn clone http://svn.freebsd.org/base/head/,创建的;还是用 svn checkout http://svn.freebsd.org/base/head 创建的

ambrosehua | February 10, 2011 5:30 AM

老大,你这里的创建一个镜像倒底是什么意思?
是用git svn clone http://svn.freebsd.org/base/head head-mirror建一个
然后再用
git svn clone files://path/to/head-mirror my-head
再到my-head里面去该吗?

aduo | April 5, 2011 11:25 PM

git: ‘svn’ is not a git command. See ‘git –help’.

Did you mean one of these?
fsck
show
为啥会这样

Xin LI replied to comment from aduo | April 5, 2011 11:44 PM

编译的时候需要指定支持svn。。。