現在有一份代碼code在版本庫reposA/dirB/下,現在想把它移動到reposB/dirAA/下,本來打算交給SA做,沒想到SA似乎 也不太懂的樣子。於是,自己在VPS搭建了一個svnserver,然后在網上查了一下資料,確實沒有明確的攻略,不過,綜合一下,卻也解決了問題。
需要達到的目的是:
1. 將代碼移動到新的版本庫
2. 將原始的提交記錄保留
版本庫的結構如下,有reposA和reposB這兩個版本庫,然后紅色的reposA/dirB/code就是需要移動的代碼目錄。本來打算用 svn move來做的,后來發現因為是不同的版本庫,所以這個想法被淘汰了。於是就要在server上想辦法了,svnadmin有兩個參數dump和load 可以將版本庫提取出來/加載進去,還有命令svndumpfilter可以過濾某些不想要/只想要的目錄,這些就足以達到目的了。
版本庫的結構如下,要將code移動到reposB/dirAA下邊:
於是,要開始嘍
注意,svn命令是在svn client端執行的,svnadmin svnserver svndumpfilter都是在svn server端執行的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#進入svn版本庫目錄 cd /opt/svndata ls #reposA reposB #將reposA導出到一個文件中 svnadmin dump reposA/ > f1 #將reposA中的code過濾出來,svndumpfilter include表示只保留制定的目錄和文件 svndumpfilter include dirB/code < f1 > f2 #將dumpfile2導入相應的目錄,也就是reposB/dirAA/,用parent-dir來指定 svnadmin load reposB --parent-dir dirAA < f2 |
這個時候會有提示說
1 |
svnadmin: File not found: transaction '1-1', path 'dirAA/dirB/code' |
這個時候,需要給reposB新建一個dirB文件夾
1 2 3 |
mkdir /path/to/reposB/dirAA/dirB svn add /path/to/reposB/dirAA/dirB svn ci -m "新增臨時文件夾" /path/to/reposB/dirAA/dirB |
再次執行命令
1 |
svnadmin load reposB --parent-dir dirAA < f2 |
就會得到
1 2 3 4 |
... * adding path : dirAA/dirB/code ... done. * adding path : dirAA/dirB/code/fileA ... done. ... |
然后,code文件夾現在在reposB/dirAA/dirB/code/這個路徑,可以使用svn mv在客戶端移動目錄
1 |
svn mv /path/to/reposB/dirAA/dirB/code/ /path/to/reposB/dirAA/ |
這樣就把reposA/dirB/code/轉移到了reposB/dirAA/code/,並且保留了相應的提交日志,目標達成。