@@ -23,7 +23,7 @@ Subversion 桥接就是进入 DVCS 世界的诱饵。
23
23
24
24
不要重写你的历史然后尝试再次推送,同时也不要推送到一个平行的 Git 仓库来与其他使用 Git 的开发者协作。
25
25
Subversion 只能有一个线性的历史,弄乱它很容易。
26
- 如果你在一个团队中工作,其中有一些人使用 SVN 而另一些人使用 Git,你需要确保每个人都使用 SVN 服务器来协作 - 这样做会省去很多麻烦。
26
+ 如果你在一个团队中工作,其中有一些人使用 SVN 而另一些人使用 Git,你需要确保每个人都使用 SVN 服务器来协作—— 这样做会省去很多麻烦。
27
27
28
28
===== 设置
29
29
@@ -40,7 +40,7 @@ $ mkdir /tmp/test-svn
40
40
$ svnadmin create /tmp/test-svn
41
41
----
42
42
43
- 然后,允许所有用户改变版本属性 - 最容易的方式是添加一个返回值为 0 的 `pre-revprop-change` 脚本。
43
+ 然后,允许所有用户改变版本属性—— 最容易的方式是添加一个返回值为 0 的 `pre-revprop-change` 脚本。
44
44
45
45
[source,console]
46
46
----
@@ -73,7 +73,7 @@ Copied properties for revision 2.
73
73
----
74
74
75
75
虽然这个操作可能只会花费几分钟,但如果你尝试拷贝原始的仓库到另一个非本地的远程仓库时,即使只有不到 100 个的提交,这个过程也可能会花费将近一个小时。
76
- Subversion 必须一次复制一个版本然后推送回另一个仓库 - 这低效得可笑,但却是做这件事唯一简单的方式。
76
+ Subversion 必须一次复制一个版本然后推送回另一个仓库—— 这低效得可笑,但却是做这件事唯一简单的方式。
77
77
78
78
===== 开始
79
79
@@ -101,7 +101,7 @@ Checked out HEAD:
101
101
file:///tmp/test-svn/trunk r75
102
102
----
103
103
104
- 这相当于运行了两个命令 - `git svn init` 以及紧接着的 `git svn fetch` - 你提供的 URL 。
104
+ 这相当于运行了两个命令—— `git svn init` 以及紧接着的 `git svn fetch` —— 你提供的 URL 。
105
105
这会花费一些时间。
106
106
测试项目只有 75 个左右的提交并且代码库并不是很大,但是 Git 必须一次一个地检出一个版本同时单独地提交它。
107
107
对于有成百上千个提交的项目,这真的可能会花费几小时甚至几天来完成。
@@ -174,7 +174,7 @@ $ git commit -am 'Adding git-svn instructions to the README'
174
174
----
175
175
176
176
接下来,你需要将改动推送到上游。
177
- 注意这会怎样改变你使用 Subversion 的方式 - 你可以离线做几次提交然后一次性将它们推送到 Subversion 服务器。
177
+ 注意这会怎样改变你使用 Subversion 的方式—— 你可以离线做几次提交然后一次性将它们推送到 Subversion 服务器。
178
178
要推送到一个 Subversion 服务器,运行 `git svn dcommit` 命令:
179
179
180
180
[source,console]
@@ -286,7 +286,7 @@ First, rewinding head to replay your work on top of it...
286
286
287
287
记住这一点很重要,因为结果是当你推送后项目的状态并不存在于你的电脑中。
288
288
如果修改并未冲突但却是不兼容的,可能会引起一些难以诊断的问题。
289
- 这与使用 Git 服务器并不同 - 在 Git 中,可以在发布前完全测试客户端系统的状态,然而在 SVN 中,你甚至不能立即确定在提交前与提交后的状态是相同的。
289
+ 这与使用 Git 服务器并不同—— 在 Git 中,可以在发布前完全测试客户端系统的状态,然而在 SVN 中,你甚至不能立即确定在提交前与提交后的状态是相同的。
290
290
291
291
你也应该运行这个命令从 Subversion 服务器上拉取修改,即使你自己并不准备提交。
292
292
可以运行 `git svn fetch` 来抓取新数据,但是 `git svn rebase` 会抓取并更新你本地的提交。
@@ -331,7 +331,7 @@ No changes between 71af502c214ba13123992338569f4669877f55fd and refs/remotes/ori
331
331
Resetting to the latest refs/remotes/origin/trunk
332
332
----
333
333
334
- 在一个合并过历史提交的分支上 `dcommit` 命令工作得很好,除了当你查看你的 Git 项目历史时,它并没有重写所有你在 `experiment` 分支上所做的任意提交 - 相反,所有这些修改显示一个单独合并提交的 SVN 版本中。
334
+ 在一个合并过历史提交的分支上 `dcommit` 命令工作得很好,除了当你查看你的 Git 项目历史时,它并没有重写所有你在 `experiment` 分支上所做的任意提交—— 相反,所有这些修改显示一个单独合并提交的 SVN 版本中。
335
335
336
336
当其他人克隆那些工作时,他们只会看到一个被塞入了所有改动的合并提交,就像运行了 `git merge --squash`;他们无法看到修改从哪来或何时提交的信息。
337
337
@@ -360,7 +360,7 @@ r91 = f1b64a3855d3c8dd84ee0ef10fa89d27f1584302 (refs/remotes/origin/opera)
360
360
361
361
===== 切换活动分支
362
362
363
- Git 通过查找在历史中 Subversion 分支的头部来指出你的提交将会到哪一个分支 - 应该只有一个,并且它应该是在当前分支历史中最后一个有 `git-svn-id` 的。
363
+ Git 通过查找在历史中 Subversion 分支的头部来指出你的提交将会到哪一个分支—— 应该只有一个,并且它应该是在当前分支历史中最后一个有 `git-svn-id` 的。
364
364
365
365
如果想要同时在不止一个分支上工作,可以通过在导入的那个分支的 Subversion 提交开始来设置本地分支 `dcommit` 到特定的 Subversion 分支。
366
366
如果想要一个可以单独在上面工作的 `opera` 分支,可以运行
@@ -376,8 +376,8 @@ $ git branch opera remotes/origin/opera
376
376
记住尽管使用的是 `git merge` 来做这个操作,而且合并可能会比在 Subversion 中更容易一些(因为 Git 会为你自动地检测合适的合并基础),但这并不是一个普通的 Git 合并提交。
377
377
你不得不将这个数据推送回一个 Subversion 服务器,Subversion 服务器不支持那些跟踪多个父结点的提交;所以,当推送完成后,它看起来会是一个将其他分支的所有提交压缩在一起的单独提交。
378
378
在合并一个分支到另一个分支后,你并不能像 Git 中那样轻松地回到原来的分支继续工作。
379
- 你运行的 `dcommit` 命令会将哪个分支被合并进来的信息抹掉,所以后续的合并基础计算会是错的 - dcommit 会使你的 `git merge` 结果看起来像是运行了 `git merge --squash`。
380
- 不幸的是,没有一个好的方式来避免这种情形 - Subversion 无法存储这个信息,所以当使用它做为服务器时你总是会被它的限制打垮。
379
+ 你运行的 `dcommit` 命令会将哪个分支被合并进来的信息抹掉,所以后续的合并基础计算会是错的—— dcommit 会使你的 `git merge` 结果看起来像是运行了 `git merge --squash`。
380
+ 不幸的是,没有一个好的方式来避免这种情形—— Subversion 无法存储这个信息,所以当使用它做为服务器时你总是会被它的限制打垮。
381
381
为了避免这些问题,应该在合并到主干后删除本地分支(本例中是 `opera`)。
382
382
383
383
===== Subversion 命令
0 commit comments