SVN跨版本库迁移目录并保留提交日志

特别提示:本人博客部分有参考网络其他博客,但均是本人亲手编写过并验证通过。如发现博客有错误,请及时提出以免误导其他人,谢谢!欢迎转载,但记得标明文章出处:http://www.cnblogs.com/mao2080/

  这几天有这样一个问题,现在有一份代码code在版本库reposA/dirB/下,现在想把它移动到reposB/dirAA/下,本来打算交给SA做,没想到SA似乎也不太懂的样子。于是,自己在VPS搭建了一个svnserver,然后在网上查了一下资料,确实没有明确的攻略,不过,综合一下,却也解决了问题。

需要达到的目的是:

1. 将代码移动到新的版本库

2. 将原始的提交记录保留

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

于是,要开始喽
注意,svn命令是在svn client端执行的,svnadmin svnserver svndumpfilter都是在svn server端执行的。

1、第一步

进入svn版本库目录
cd /opt/svndata
ls
#reposA reposB

2、第二步

将reposA导出到一个文件中
svnadmin dump reposA/ > f1.dump

3、第三步

将reposA中的code过滤出来,svndumpfilter include表示只保留制定的目录和文件
svndumpfilter include dirB/code < f1.dump > f2.dump

4、第四步

将dumpfile2导入相应的目录,也就是reposB/dirAA/,用parent-dir来指定
svnadmin load reposB --parent-dir dirAA < f2.dump
这个时候会有提示说

svnadmin: File not found: transaction '1-1', path 'dirAA/dirB/code'
这个时候,需要给reposB新建一个dirB文件夹

mkdir /path/to/reposB/dirAA/dirB
svn add /path/to/reposB/dirAA/dirB
svn ci -m "新增临时文件夹" /path/to/reposB/dirAA/dirB
再次执行命令

svnadmin load reposB --parent-dir dirAA < f2
就会得到

...
* adding path : dirAA/dirB/code ... done.
* adding path : dirAA/dirB/code/fileA ... done.
...
然后,code文件夹现在在reposB/dirAA/dirB/code/这个路径,可以使用svn mv在客户端移动目录

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

参考网站:http://blog.csdn.net/tianshijianbing1989/article/details/41980675

5、常用命令

启动svn服务:svnserve -d -r /home/svndata

关闭svn服务:ps -ef|grep svnserve 使用kill -9 杀进程号

关闭防火墙:systemctl stop firewalld.service

posted @ 2017-10-25 19:30  mao2080  阅读(3951)  评论(0编辑  收藏  举报