开发者社区> 科技小能手> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

svn仓库迁移

简介:
+关注继续查看

以下是subversion官方推荐的备份方式。(以下方式全部保留commit日志)

svnserver:

ip:192.168.85.130

hostname:vm2.lansgg.com

data 目录 :/svn/csvn/data/repositories/


svn  仓库结构如下:每个部门一个大的目录,下面分别根据创建仓库,示例目录结构如下:

wKioL1fJPJbD6KMIAAAvDh8eiXQ500.jpg-wh_50

情景一、整目录(仓库)迁移

将dev整个迁移到另外一个svn服务器(如:vm1.lansgg.com)

因为是整个目录迁移,只需要将整个仓库目录rsync到 vm1.lansgg.com 上的仓库位置即可,单独进行权限配置,并且log也是完整保存。

情景二、仓库迁移

将dev目录下的web项目 ( dev/web )迁移到qa目录 (qa/web)下;

将        https://vm2.lansgg.com/svn/dev/web/   迁移到  https://vm2.lansgg.com/svn/qa/ 下

1、先将整个目录备份:

1
2
3
4
5
[root@vm2 ~]# svnadmin dump /svn/csvn/data/repositories/dev > dev.dump
* 已转存版本 0。
* 已转存版本 1。
* 已转存版本 2。
[root@vm2 ~]#

2、我们需要将 dev 仓库中的 web 目录进行迁移,所以我们还需要进行过滤。如下:

1
2
3
4
5
6
7
8
9
10
11
12
[root@vm2 ~]# svndumpfilter include web < dev.dump > dev.web.dump
包含的前缀: 
   '/web'
 
版本 0 提交为 0。
版本 1 提交为 1。
版本 2 提交为 2。
 
丢弃 1 个节点: 
   '/wap'
 
[root@vm2 ~]#

3、将过滤出来的dump 文件进行还原

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@vm2 ~]# svnadmin load /svn/csvn/data/repositories/qa/ < dev.web.dump 
<<< 开始新的事务,基于原始版本 1
     * 正在增加路径: web ...完成。
     * 正在增加路径: web/t2.jpg ...完成。
     * 正在增加路径: web/t3.jpg ...完成。
     * 正在增加路径: web/t4.jpg ...完成。
     * 正在增加路径: web/新建 Microsoft Access 数据库.accdb ...完成。
     * 正在增加路径: web/新建 Microsoft Word 文档.docx ...完成。
     * 正在增加路径: web/新建文本文档.txt ...完成。
 
------- 提交后版本 1 >>>
 
<<< 开始新的事务,基于原始版本 2
 
------- 提交后版本 2 >>>
 
[root@vm2 ~]#

还原完成,commit log也是存在的

wKioL1fNHMrRntSDAACrEvHeLxY668.jpg-wh_50

情景三、将上面分离出来的 web 目录作为一个新的仓库进行恢复


将        https://vm2.lansgg.com/svn/dev/web/   迁移到  https://vm2.lansgg.com/svn/web 下

如果你想将  web  目录作为一个新的仓库进行恢复, 
不过它保留了原版本库的精确路径结构。也就是说,虽然项目  web  现在独占了一个版本库,但版本库中还保留着名为 web  的顶级目录。如果希望trunk、tags和branches这三个目录直接位于版本库的根路径下,你可能需要编辑转储文件,调整Node-path和Copyfrom-path头参数,将路径 web/ 删除。同时,你还要删除转储数据中创建 web 目录的部分。一般来说,就是如下的一些内容:

(删掉如下内容,并且将所有文件前路径的web路径删掉。)

 Node-path: web 
 Node-action: add 
 Node-kind: dir 
 Content-length: 0
警告: 
如果你打算通过手工编辑转储文件来移除一个顶级目录,注意不要让你的编辑器将换行符转换为本地格式(比如将\r\n转换为\n)。否则文件的内容就与所需的格式不相符,这个转储文件也就失效了。 
剩下的工作就是创建1个新的版本库,然后将转储文件导入:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@vm2 ~]# svnadmin create /svn/csvn/data/repositories/web
[root@vm2 ~]# svnadmin load /svn/csvn/data/repositories/web/ < dev.web.dump 
<<< 开始新的事务,基于原始版本 1
     * 正在增加路径: /t2.jpg ...完成。
     * 正在增加路径: /t3.jpg ...完成。
     * 正在增加路径: /t4.jpg ...完成。
     * 正在增加路径: /新建 Microsoft Access 数据库.accdb ...完成。
     * 正在增加路径: /新建 Microsoft Word 文档.docx ...完成。
     * 正在增加路径: /新建文本文档.txt ...完成。
 
------- 提交后版本 1 >>>
 
<<< 开始新的事务,基于原始版本 2
 
------- 提交后版本 2 >>>
 
[root@vm2 ~]#

wKiom1fNORuzRxK4AABn1-C7KoE952.jpg-wh_50


情景四:

版本库的结构如下,有reposA(dev)和reposB (ops) 这两个版本库,然后红色的 reposA/dirB/code 就是需要移动的代码目录。本来打算用svn move来做的,后来发现因为是不同的版本库,所以这个想法被淘汰了。于是就要在server上想办法了,svnadmin有两个参数dump和load可以将版本库提取出来/加载进去,还有命令svndumpfilter可以过滤某些不想要/只想要的目录,这些就足以达到目的了。

版本库的结构如下,要将code移动到reposB/dirAA下边:

wKioL1fOKYyDUUq4AAAqoPpBar0042.png-wh_50


将 https://vm2.lansgg.com/svn/dev/web/scan/  的 scan 迁移到 https://vm2.lansgg.com/svn/ops/opsdev/ 下面 

wKioL1fOLoOgQgk4AABOgzEgbJ0971.jpg-wh_50

1、#将  dev  仓库备份到一个文件中

1
2
3
4
5
6
7
[root@vm2 ~]# svnadmin dump /svn/csvn/data/repositories/dev/ > dev.dump
* 已转存版本 0。
* 已转存版本 1。
* 已转存版本 2。
* 已转存版本 3。
* 已转存版本 4。
[root@vm2 ~]#

2、#将 dev 中的 scan 过滤出来,svndumpfilter include表示只保留制定的目录和文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@vm2 ~]# svndumpfilter include web/scan < dev.dump > dev.scan.dump
包含的前缀: 
   '/web/scan'
 
版本 0 提交为 0。
版本 1 提交为 1。
版本 2 提交为 2。
版本 3 提交为 3。
版本 4 提交为 4。
 
丢弃 8 个节点: 
   '/wap'
   '/web'
   '/web/t2.jpg'
   '/web/t3.jpg'
   '/web/t4.jpg'
   '/web/新建 Microsoft Access 数据库.accdb'
   '/web/新建 Microsoft Word 文档.docx'
   '/web/新建文本文档.txt'
 
[root@vm2 ~]#

3、#将 dumpfile 导入相应的目录,也就是ops/opsdev/,用parent-dir来指定

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@vm2 ~]# svnadmin load /svn/csvn/data/repositories/ops --parent-dir opsdev < dev.scan.dump 
<<< 开始新的事务,基于原始版本 1
 
------- 提交新版本 2 (从原始版本 1 装载) >>>
 
<<< 开始新的事务,基于原始版本 2
 
------- 提交新版本 3 (从原始版本 2 装载) >>>
 
<<< 开始新的事务,基于原始版本 3
 
------- 提交新版本 4 (从原始版本 3 装载) >>>
 
<<< 开始新的事务,基于原始版本 4
svnadmin: 没有找到文件: 事务“4-4”,路径 “opsdev/web/scan
     * 正在增加路径: opsdev/web/scan ...[root@vm2 ~]#

这个时候,需要给 ops 下的 opsdev 新建一个 web 文件夹

wKiom1fOa5Shs_mZAABZMXjQw_k548.jpg-wh_50

再次执行命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[root@vm2 ~]# svnadmin load /svn/csvn/data/repositories/ops --parent-dir opsdev < dev.scan.dump 
<<< 开始新的事务,基于原始版本 1
 
------- 提交新版本 6 (从原始版本 1 装载) >>>
 
<<< 开始新的事务,基于原始版本 2
 
------- 提交新版本 7 (从原始版本 2 装载) >>>
 
<<< 开始新的事务,基于原始版本 3
 
------- 提交新版本 8 (从原始版本 3 装载) >>>
 
<<< 开始新的事务,基于原始版本 4
     * 正在增加路径: opsdev/web/scan ...完成。
     * 正在增加路径: opsdev/web/scan/adxnotice.pdf ...完成。
 
------- 提交新版本 9 (从原始版本 4 装载) >>>
 
[root@vm2 ~]#

4、然后,scan 文件夹现在在  https://vm2.lansgg.com/svn/ops/opsdev/web/scan/  这个路径,可以使用svn mv在客户端移动目录

1
2
3
4
[root@vm2 ~]# svn mv --username=admin https://vm2.lansgg.com/svn/ops/opsdev/web/scan/ https://vm2.lansgg.com/svn/ops/opsdev/ -m "old to new"
 
提交后的版本为 10。
[root@vm2 ~]#

这样就把reposA/dirB/code/ 转移到了 reposB/dirAA/code/,并且保留了相应的提交日志,目标达成。

wKiom1fObfyREzC2AAC9WItjaTg263.jpg-wh_50


情景五:

接上面的案例,如果想将scan下面的文件移动到ops下的doc目录呢?

一切的迁移只要你会修改dump文件就简单了。

比如如下:修改 上面过滤出来的 dev.scan.dump 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Node-path: web/scan
Node-action: add
Node-kind: dir
Prop-content-length: 10
Content-length: 10
 
PROPS-END
 
#######以上删掉
 
Node-path: web/scan/adxnotice.pdf       #web/scan   修改为 doc 即可。
Text-content-md5: ed04336a819674fb4f7492ac857ec2c6
Node-action: add
Text-content-sha1: eab72cc358e344dac94346186efd88eae2e39be2
Node-kind: file
Prop-content-length: 59
Text-content-length: 152699
Content-length: 152758

再次执行命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@vm2 ~]# svnadmin load /svn/csvn/data/repositories/ops --parent-dir doc < dev.scan.dump 
<<< 开始新的事务,基于原始版本 1
 
------- 提交新版本 16 (从原始版本 1 装载) >>>
 
<<< 开始新的事务,基于原始版本 2
 
------- 提交新版本 17 (从原始版本 2 装载) >>>
 
<<< 开始新的事务,基于原始版本 3
 
------- 提交新版本 18 (从原始版本 3 装载) >>>
 
<<< 开始新的事务,基于原始版本 4
     * 正在增加路径: /doc/adxnotice.pdf ...完成。
 
------- 提交新版本 19 (从原始版本 4 装载) >>>

wKioL1fOcb6Ap3WxAACXdQAoUaU903.jpg-wh_50


本文转自 西索oO 51CTO博客,原文链接:

http://blog.51cto.com/lansgg/1846888

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
局域网自建YUM仓库
在公司的局域网内自建一个yum仓库,对于不能连外网的环境非常有用。同时也提高了内网服务器的下载速度。
57 0
Git仓库配置
安装git依赖包 yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker 源码安装 wget https://github.
954 0
Docker 配置国内镜像仓库
 Docker在默认安装之后,当需要下载镜像时,通过命令docker pull learn/tutoral拉取示例镜像,或者其他镜像时,都是访问默认的docker hub 上的镜像,在国内网络环境下,下载一个镜像基本都在半小时或者更长时间,可以考虑使用Registry Mirror配置国内仓库镜像.     使用由DaoCloud提供的Registry Mirror服务,可以让我们在使用拉取镜像命令不变的情况下,拉取速度成倍提升,该配置过程只需三步。
4945 0
如何迁移整个git仓库
转自准备更换git托管,如何迁移原git仓库一个回答 如果你想从别的 Git 托管服务那里复制一份源代码到新的 Git 托管服务器上的话,可以通过以下步骤来操作。
946 0
23703
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载