版本的要求

务必保证 git-core 和 git-svn 的版本大于 1.5.3,这里使用的版本为 1.5.4.2-1~bpo40+2。

svn 仓库

我们这里以 Google Code Hosting 提供的 svn 仓库为原型虚拟了一个:
https://virtual.googlecode.com/svn

用户名和密码分别为: zhang, ftpw

建立工作目录

1$ mkdir /tmp/virtual && cd /tmp/virtual
2$ git-svn init https://virtual.googlecode.com/svn/trunk . --username=zhang
3$ git-svn fetch
4$ ls -F
debian/  HOME/  README  TODO

新建目录(1),并将该目录作为 git-svn 的工作目录(2),用户名为 zhang。获取 svn 仓库内的数据(3),此时需要输入密码 ftpw。查看获取到的文件列表(4)。

示例1 修改数据后提交至 svn 仓库(理想情况)

提交/签入(commit/check in),这是使用工具操作版本管理系统的基本动作。

1$ echo "有一天我梦到自己在考试" >> README
2$ echo "醒来的时候我果然在考试" >> TODO
3$ git-commit -a -m "小笑话"
Created commit 8fb8ee7: 小笑话
 2 files changed, 2 insertions(+), 0 deletions(-)
4$ git-svn rebase
5$ git-svn dcommit
Committing to <a href="https://virtual.googlecode.com/svn/trunk">https://virtual.googlecode.com/svn/trunk</a> ...
    M   README
    M   TODO
Committed r10
    M   TODO
    M   README
r10 = 7123a9eb252c31a2fcbd1c2908642fa6794fe687 (git-svn)
No changes between current HEAD and refs/remotes/git-svn
Resetting to the latest refs/remotes/git-svn

修改若干文件(1, 2),此后,您可以像使用 svn status/svn diff 一样使用 git-status/git-diff 来查看修改情况。确定修改完成后提交至本地仓库(3)。在正式提 交给 svn 仓库之前(5),从 svn 仓库获取最新的数据(4)对您的提交动作来说非常重要。 这里假设的理想情况是在您正式提交给 svn 仓库之前,svn 仓库没有发生更新。

示例2 修改数据后提交至 svn 仓库(发生冲突)

在提交/签入(commit/check in)过程中,发生了合并冲突(CONFLICT)时的基本动作。

1$ vi debian/changelog
   ...
2$ git-commit -a -m "发布一个新版本"
Created commit 934b74c: 发布一个新版本
 1 files changed, 6 insertions(+), 0 deletions(-)
3$ git-svn rebase
    M   debian/changelog
 r11 = ae2199620a1e66130e12d03bd48a66c8edddc195 (git-svn)
First, rewinding head to replay your work on top of it...
HEAD is now at ae21996... New Upstream Released
Applying 发布一个新版本
error: patch failed: debian/changelog:1
 error: debian/changelog: patch does not apply
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merged debian/changelog
CONFLICT (content): Merge conflict in debian/changelog
 Failed to merge in the changes.
Patch failed at 0001.

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
 To restore the original branch and stop rebasing run "git rebase --abort".

rebase refs/remotes/git-svn: command returned error: 1
4$ vi debian/changelog
   ...
5$ git-commit -a -m "冲突解决后发布的最新版本"
 Created commit b899d8b: 冲突解决后发布的最新版本
 1 files changed, 2 insertions(+), 1 deletions(-)
6$ rm -rf .dotest
7$ git-svn rebase
Current branch HEAD is up to date.
8$ git-svn dcommit
Committing to <a href="https://virtual.googlecode.com/svn/trunk">https://virtual.googlecode.com/svn/trunk</a> ...
     M   debian/changelog
Committed r12
    M   debian/changelog
r12 = cc5b21aaf77a2952b4a3fa74a80cbdd826f28d92 (git-svn)
No changes between current HEAD and refs/remotes/git-svn
Resetting to the latest refs/remotes/git-svn

将平日修改的文件(1),提交到本地 git 仓库(2)。在提交至 svn 仓库前,先获取 svn 仓库的最新数据(3)。此时发现 debian/changelog 文件在 svn 仓库中已被更新,由于我 们平日也对 debian/changelog 文件作过修改,这就导致该文件出现了合并冲突。手工修 改该文件解决冲突(4),然后重新提交至本地 git 仓库(5)。准备重新提交至 svn 仓库 (8),保险起见,我们再一次获取 svn 仓库的最新数据(7),为此要先删除因刚才(3)操作 失败带来的临时目录 .dotest(6)。(或许存在更好的解决 .dotest 目录的方法。)

示例3 修改提交至本地 git 仓库时的留言

有时候我们希望能在 git-commit 之后修改当时 -m 参数后面的留言,如下例中对拼写错误的修改

1$ touch foo
2$ git-add foo
3$ git-commit -a -m "New flie"
4$ git-commit --amend
5$ git-rebase
Current branch HEAD is up to date.
6$ git-svn dcommit
Committing to <a href="https://virtual.googlecode.com/svn/trunk">https://virtual.googlecode.com/svn/trunk</a> ...
     A   foo
Committed r13
    A   foo
r13 = 9f9db8db023de576f8ac63c993619218febbb74d (git-svn)
No changes between current HEAD and refs/remotes/git-svn
Resetting to the latest refs/remotes/git-svn
7$ mkdir /tmp/test && cd /tmp/test
 8$ svn co <a href="https://virtual.googlecode.com/svn/trunk">https://virtual.googlecode.com/svn/trunk</a> . --username=zhang
9$ svn log
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
r13 | zhang | 2008-03-09 22:08:37 +0800 (日, 09  3月 2008) | 2 lines
 
New file

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
r12 | zhang | 2008-03-09 21:07:24 +0800 (日, 09  3月 2008) | 2 lines

冲突解决后发布的最新版本

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 r11 | s5unty | 2008-03-09 20:56:39 +0800 (日, 09  3月 2008) | 1 line

New Upstream Released

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
r10 | zhang| 2008-03-09 20:44:57 +0800 (日, 09  3月 2008) | 2 lines
 
小笑话
   ...

新建一个文件 foo(1)并添加至本地 git 仓库(2),然后提交(3)。此时我们发现刚才提交 的留言中错把 file 拼写成了 flie,现在进行修改(4)。然后提交给 svn 仓库并观察日 志(5-9)。