BaoYaEr
SVN版本库的迁移
【版本控制之类】SVN版本库的迁移
【1.业务需求】
经过前面的SVN搭建,权限配置和强制写日志的工作之后,今天的任务是把原来其它分散的各个版本库统一迁移到新的版本库,集中统一管理。要求不改变原有的版本库的内容和版本号。
【2.基本思路】
要实现版本库的无缝迁移,必须通过以下3个步骤:
①导出旧的版本库
②导入新的版本库
③通知客户端切换版本库分支
首先来看第一步:导出旧的版本库。我们知道SVN提供了check out命令和export命令签出,导出版本库中的内容。对于版本库内容比较少的情况这种方法可以采用。但是如果版本库中内容比较多,那么这种方法就显得 很笨重了,而且还涉及到版本号改变的问题。所以首先摈弃这种做法。
我们知道Oracle提供了export/import命令来将数据库导出成一个二进制文件,然后导入。同样的SVN也提供了一对命令:dump和 load。不同的是这两个命令导出的是文本内容(肉眼可以读懂)。而且还有一次性导出和增量导出,单版本导出与多版本导出等多种选择操作,就是这个了。
其次我们来看“通知客户端切换版本库分支”。在我们完成服务器端的版本迁移之后,必须通知客户端运行切换分支的命令,否则客户端的提交还是提交到旧的版本库去。SVN也为我们准备了这样的命令:svn switch。
【3.相关命令】
首先我们来看一下SVN的dump和load命令
①svnadmin dump命令语法
svnadmin dump REPOS_PATH
[
-r LOWER[:UPPER
]
]
[
--incremental
]
svnadmin dump命令用于导出整个Repository或Repository下的某个范围的修订版本。REPOS_PATH是版本库的路径,[-r LOWER[:UPPER]]用于指定导出的修订版本范围,由参数-r和两个用:号隔开阿拉伯数字组成。例如:-r 0:50表示导出才版本0到版本50之间的所有修订版,-r是revision的缩写。
而另一个关键参数是--incremental。它使用增量方式来导出版本,即每次都只导出自上一个版本以来的修改。这样的好处是第一:可以把一个大的文 件切分成若干个小的文件。第二:在版本库已经存在的情况下,我们只需要每次导出修改的部分,不需要每次都导出整个版本库的内容。甚至可以通过hook脚本 每天晚上自动将当天的修改dump出来做备份用。
②svnadmin load命令语法
svnadmin load REPOS_PATH
svnadmin load命令用于从标准输入流/其它流中导入版本库,REPOS_PATH是要导入的目标版本库。
③dump和load的输出/入重定向
svnadmin dump myrepos > dumpfile
svnadmin load newrepos < dumpfile
默认情况下dump和load命令分别输出到默认输出设备(屏幕)和从默认输入设备(键盘)导入。但我们也可以把输出流/输入流重定向。例如上面的第一个 命令,使用重定向符>把屏幕的输出定向当前目录下的dumpfile,而第二个命令从当前目录下的dumpfile文件导入。
上面的命令使用起来已经很方便了,那么还有没有更加方便的用法呢?当然有!就是使用管道命令把两个命令合二为一。
svnadmin dump myrepos | svnadmin load newrepos
④svn switch命令语法
svn switch URL
[
PATH
]
switch --relocate FROM TO
[
PATH
]
svn switch命令用于更新工作副本的URL。意即指向新的版本库位置。首先要注意的一点是我们即可以将整个工作副本指向新的URL,也可将工作副本下的某个目录指向新的URL。
另外一个重要的参数就是--relocate。这个参数是否使用对于结果如何有很大影响,使用不当甚至可能会造成版本库不可用。其中有两条重要的规则:
A.假如工作副本只是映射到同一个版本库内的不同位置,那么使用svn switch即可
B.假如工作副本已是映射到不同的版本库,那么必须使用svn switch --relocate
上面第二条规则通常发生在我们需要将整个版本库迁移到另外一台机,或者同一台机的不同版本库时。这个时候使用--relocate会刷新原有工作副本中每个文件的URL头部。
【4.示例操作】
好了,下面我们来看如何执行版本库的迁移工作。
①查看当前旧版本库最新的版本号是多少
C:\peng\Other>svnlook youngest newRepo
161
②分批增量导出版本库内容
C:\peng\Other>
svnadmin dump newRepo -r
0
:
50
> dumpfile1
* Dumped revision
0
.
* Dumped revision
1
.
* Dumped revision
2
.
* Dumped revision
3
.
导出第一个文件,版本号从0到50的修订版本
C:\peng\Other>
svnadmin dump newRepo -r
51
:
100
--incremental
> dumpfile2
* Dumped revision
51
.
* Dumped revision
52
.
* Dumped revision
53
.
* Dumped revision
54
.
* Dumped revision
55
.
导出第二个文件,版本号从51到100的修订版本
C:\peng\Other>
svnadmin dump newRepo -r
101
:
161
--incremental
> dumpfile3
* Dumped revision
101
.
* Dumped revision
102
.
* Dumped revision
103
.
* Dumped revision
104
.
* Dumped revision
105
.
请注意我们上面三个命令中第2,3个命令多了一个--incremental的参数,这就是采用了增量的方式导出,下面我们一次按照顺序导入
③分批导入版本库文件
C:\peng\Other>svnadmin load newRepo2 < dumpfile1
<<< 开始新的事务,基于最初的修订版
1
* 正在添加路径:a
done.
------- 提交后的修订版
1
>>>
<<< 开始新的事务,基于最初的修订版
2
* 正在删除路径:a
done.
首先导入dumpfile1,然后是dumpfile2,dumpfile3
C:\peng\Other>svnadmin load newRepo2 < dumpfile2
<<< 开始新的事务,基于最初的修订版
50
* 正在添加路径:branches
done.
------- 提交新修订版
12
(从原始修订版
50
装载) >>>
<<< 开始新的事务,基于最初的修订版
51
* 正在删除路径:branches
done.
------- 提交新修订版
13
(从原始修订版
51
装载) >>>
导入文件dumpfile2。依次类推dumpfile3。
如果我们前面不使用--incremental方式导出,此处分批导入三个dump文件,则会提示错误:版本库文件已经存在。
④客户端切换工作副本URL
C:\peng\Other>svnserve -d -r c:\peng\other
首先我们把SVN服务的根目录指向c:\peng\other目录,在这个目录下有两个repository,其中一个名为newRepo,另外一个名为呢wRepo2。
C:\peng\Other>dir
Volume in drive C is ESOE_W2K
Volume Serial Number is BC1B-
22E6
Directory of C:\peng\Other
2008
-
12
-
26
15
:
10
<DIR> .
2008
-
12
-
26
15
:
10
<DIR> ..
2008
-
12
-
23
10
:
04
<DIR> Backup
2008
-
12
-
26
14
:
21
45
,
578
dumpfile1
2008
-
12
-
26
14
:
22
39
,
567
dumpfile2
2008
-
12
-
26
14
:
23
55
,
740
dumpfile3
2008
-
12
-
15
09
:
08
<DIR> newRepo
2008
-
12
-
26
14
:
20
<DIR> newRepo2
2008
-
12
-
26
15
:
25
<DIR> ps
2008
-
12
-
24
15
:
11
<DIR> Toolbar
3
File(s)
140
,
885
bytes
7
Dir(s)
2
,
668
,
414
,
976
bytes free
C:\peng\Other>
首先我们从newRepo这个版本库中check out出一个子目录ps
C:\Documents and Settings\qlinpen.E0015609D6309>svn checkout svn://localhost/newRepo/ps c:/peng/other/ps
A C:\peng\Other\ps\ps.txt
取出修订版
170
。
现在该工作副本已经和:svn://localhost/newRepo/ps发生了映射关系。我们可以使用svnlook info来显示这个工作副本的一般信息
C:\peng\Other>cd ps
C:\peng\Other\ps>svn info
路径:.
地址(URL):svn://localhost/
newRepo
/ps
Repository Root: svn://localhost/newRepo
档案库 UUID:6fbeb35b-c7e4-984d-b2ac-32812dcf3078
修订版:
170
节点种类:目录
调度:正常
最后修改的作者:admin
最后修改的修订版:
170
最后修改的时间:
2008
-
12
-
26
14
:
52
:
32
+
0800
(星期五
,
26
十二月
2008
)
输出信息中明确地指出ps目录指向了svn://localhost/newRepo/ps。下面我们来把它指向另一个repository下的同名位置:svn://localhost/newRepo2/ps。
C:\peng\Other\ps>svn switch
--relocate
svn://localhost/newRepo/ps svn://localhost/newRepo2/ps
C:\peng\Other\ps>
经过上面的切换后,再次使用svnlook info输出一般信息,发现URL已经被成功切换过来了
C:\peng\Other\ps>svn info
路径:.
地址(URL):svn://localhost/
newRepo
2
/ps
Repository Root: svn://localhost/newRepo2
档案库 UUID:6fbeb35b-c7e4-984d-b2ac-32812dcf3078
修订版:
170
节点种类:目录
调度:正常
最后修改的作者:admin
最后修改的修订版:
170
最后修改的时间:
2008
-
12
-
26
14
:
52
:
32
+
0800
(星期五
,
26
十二月
2008
)
我们尝试着在ps目录下修改文件ps.txt为ps.doc,然后提交看看会提交到那个repos去?
C:\peng\Other\ps>svn list svn://localhost/newRepo/ps
ps.txt
C:\peng\Other\ps>svn list svn://localhost/newRepo2/ps
ps.doc
C:\peng\Other\ps>
很明显现在的提交全部都去到新的位置了!切换成功。
发表于 2009-08-29 12:11
大田斗
阅读(12294)
评论(4)
编辑
收藏
所属分类:
其它
评论
#
re: SVN版本库的迁移
您好,我按照您提高的方法,版本库转移成功了,但是对新的版本库Checkout出来,修改,提交,总是报错。
access to '/svn/demo1/!svn/act/db757c69-17c4-a942-b3a4-b668cc18ce41' forbidden
权限我也给了。能解释这个错误的原因吗?
shan9liang@163.com
#
re: SVN版本库的迁移
可惜 --relocate只能是同名目录间的操作,迁移到不同目录下就没辙了,只能重新checkout?
如果两个库uuid设成一样,会出现什么情况?
#
re: SVN版本库的迁移[未登录]
不同目录下,如何relocate
#
re: SVN版本库的迁移[未登录]
解决了吗,不同目录下@Christina
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
maven 的配置收藏
Maven仓库管理-Nexus
XPath语法
SVN版本库的迁移
Subversion备份【zt】
使用 Resin 自带的身份验证机制给页面加入密码保护
mysql 使用
CruiseControl 入门
maven2 起步
windows安装基于Apache的SVN服务器(包括SSL配置)[
<
2024年11月
>
日
一
二
三
四
五
六
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
导航
BlogJava
首页
发新随笔
发新文章
联系
聚合
管理
统计
随笔: 32
文章: 427
评论: 144
引用: 0
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(5)
给我留言
查看公开留言
查看私人留言
随笔档案
2008年12月 (1)
2008年4月 (2)
2008年2月 (1)
2008年1月 (1)
2007年12月 (3)
2007年11月 (1)
2007年10月 (3)
2007年7月 (2)
2007年6月 (1)
2007年4月 (2)
2007年3月 (3)
2007年2月 (5)
2007年1月 (3)
2006年12月 (4)
文章分类
axis(6)
(rss)
eclipse(7)
(rss)
Hibernate(30)
(rss)
html/js/css(107)
(rss)
java(106)
(rss)
linux(7)
(rss)
Lucene(7)
(rss)
spring(36)
(rss)
Spring CLOUd(1)
(rss)
Strtus(30)
(rss)
其它(48)
(rss)
开源opensource(48)
(rss)
数据库DateBase(30)
(rss)
设计模式(12)
(rss)
文章档案
2018年8月 (1)
2012年5月 (1)
2012年4月 (2)
2011年7月 (6)
2010年3月 (1)
2010年2月 (1)
2010年1月 (3)
2009年12月 (1)
2009年10月 (1)
2009年8月 (3)
2009年3月 (1)
2009年2月 (1)
2008年12月 (3)
2008年11月 (10)
2008年10月 (3)
2008年9月 (2)
2008年8月 (2)
2008年7月 (4)
2008年6月 (13)
2008年5月 (15)
2008年4月 (9)
2008年3月 (10)
2008年1月 (18)
2007年12月 (33)
2007年11月 (6)
2007年10月 (18)
2007年9月 (10)
2007年8月 (18)
2007年7月 (15)
2007年6月 (25)
2007年5月 (19)
2007年4月 (26)
2007年3月 (38)
2007年2月 (33)
2007年1月 (27)
2006年12月 (27)
2006年11月 (12)
java
Ajax特效网站
cndiy nio
GRO
Hani Suleiman's blog
Java之路
java论坛
J道
mule
mule 入门
oksonic(动画教程)
一路由你
中国eclipse
八进制
在线源码
多线程实战
天火
小米的blogjava
幻境伯克----jface/swt
很全的博克-强
每日一得
满江红
邢红瑞
飞翔
鸟诗选(js)
鸟食轩 (dhtml)
工具
apache中文手册
extjs学习
iconFindre
java 安全
javaresearch
java技巧网
js之王
matrix(study)
prototype api
spring中文
北京IT企业速查
在线流程图工具
雅虎翻译
朋友
Happyshow
hibernate异常
skywalker
sunshow
xf
亚光
同云博客
小弟鹏
张玉磊
昕
李阳
黄鸣
搜索
积分与排名
积分 - 1098457
排名 - 28
最新评论
1. re: hibernate.cfg.xml配置
好全啊 .. 棒棒哒 ~ !
--junqinag.yang
2. re: Quartz任务调度快速入门
我现在来看还是觉得不错
--小任
3. re: js中this的总结
评论内容较长,点击标题查看
--pam
4. re: Quartz任务调度快速入门
楼主辛苦
--yd
5. re: Quartz任务调度快速入门
顶了,内容写的很好
--sen
阅读排行榜
1. 网页不缓存(3536)
2. Form嵌套引起的问题 (2830)
3. 解决IE下CSS背景图片闪烁的Bug(2432)
4. Spring AOP的动态载入原理(2394)
5. 如何制作漂亮的Excel表格(2022)
评论排行榜
1. 北京户口--吃官司(5)
2. 开始→运行→输入的命令集锦(3)
3. 让网页上的所有图片动起来(2)
4. Dom4j 编码问题彻底解决 (1)
5. 心情不爽(1)