版本的要求
务必保证 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)。