這幾天有這樣一個問題,現在有一份代碼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