同事亂提交了一個版本之后,SVN上最新版本出現了問題。
原本按照網上其他人的說法,可以手動到服務器端干掉最新版的存檔,並修改版本記錄到前一個版本號即可,但是這應該是個坑。
掉進這個坑后,需要解決,又不能直接讓大家提交新版本到新庫,因為很多代碼還沒來得及同步。
好在SVN能通過不復雜的命令操作解決問題。
過程很簡單, 導出正確的版本,重建新庫。
【下列操作均在對應項目的Repo文件夾內進行】
進入db文件夾:
導出前需要手動檢查 Current文件中的版本號,是否與 revs/0/下最大號碼的文件一致。
此外,還需要檢查 txn-current 文件內版本號與 revprops/0/文件夾下最大號一致
檢查之后在CMD下進入svn安裝路徑,鍵入命令:
svnadmin dump [Old Repo PATH] > [New Repo PATH]
如果要導出特定版本:
svnadmin dump -r [Version.] [Old Repo PATH] > [New Repo PATH]
【注意,版本號-1才是此處的版本參數。】
之后重建即可:
svnadmin create PATH [New PATH]
svnadmin load PATH < [New Repo PATH]
【當然,組內習慣性的進行正確合理的版本管理工作流程才是王道】
【附上更多資料】
另附一篇更好的博客:http://blog.csdn.net/windone0109/article/details/2908133
初級篇:
導出:
$svnlook youngest myrepos //查看到目前為止最新的版本號
$svnadmin dump myrepos > dumpfile //將指定的版本庫導出成文件dumpfile
導入:
$svnadmin load newrepos < dumpfile
中級篇:
$svnadmin dump myrepos –r 23 >rev-23.dumpfile //將version23導出
$svnadmin dump myrepos –r 100:200 >rev-100-200.dumpfile //將version100~200導出
對比較大的庫可以分解成幾個文件導出,便於備份
$svnadmin dump myrepos –r 0:1000 >0-1000.dumpfile
$svnadmin dump myrepos –r 1001:2000 --incremental >1001-2000.dumpfile
$svnadmin dump myrepos –r 2001:3000 --incremental >2001:3000.dumpfile
在導入時,可以將這幾個備份文件裝載到一個新的版本庫中
$svnadmin load myrepos < 0-1000.dumpfile
$svnadmin load myrepos < 1001-2000.dumpfile
$svnadmin load myrepos < 2001:3000.dumpfile
高級篇:
過濾版本庫歷史:
假設有三個項目的版本庫
/RigTMS
/DocProtect
/Odin
現需要將這三個項目轉移到獨立的三個版本庫中,需要做如下操作
1、轉儲整個版本庫
$svnadmin dump /path/to/repos > repos-dumpfile
2、將轉儲文件三次過濾,每次僅保留一個定級目錄,即可以得到三個轉儲文件
$svndumpfilter include RigTMS < repos-dumpfile > RigTMS-dumpfile
$svndumpfilter include DocProtect < repos-dumpfile > DocProtect-dumpfile
$svndumpfilter include Odin < repos-dumpfile >Odin-dumpfile
3、雖然現在的RigTMS、DocProtect、Odin都可以用來創建一個可用的版本庫,但他們保留了原版本庫的精確路徑結構(例如: RigTMS的頂級目錄為/RigTMS/trunk、/RigTMS/branches、/RigTMS/tags,而非我們所需要的/trunk、/branches、/tags),如果要實現目標,需要編輯轉儲文件,調整Node-path和Copyfrom-path頭參數,將路徑/RigTMS刪除,同時還要轉儲數據中創建RigTMS目錄的部分。
Node-path:RigTMS
Node-action:add
Node-kind:dir
Content-length:0
*****特別注意點:如果使用手工編輯dumpfile文件來移除一個頂級目錄,需要注意不要讓使用的編輯器將換行符轉換為本地格式(比如將/r/n轉換為/n),否則文件的內容就與原來的格式不符,這個轉儲文件就失效了。具體做法就是當你在使用編輯器打開文件的時候,編輯器會提示用戶是否需要轉換格式,一定要選擇“否”,切記!!切記!!
4、接下來就是創建三個新的版本庫,然后將新過濾出來並修改好的三個轉儲文件導入
$svnadmin create RigTMS;svnadmin load RigTMS < RigTMS-dumpfile
$svnadmin create DocProtect;svnadmin load DocProtect < DocProtect-dumpfile
$svnadmin create Odin;svnadmin load Odin < Odin -dumpfile
****備份環境注意點:
1、確保沒有其他進程訪問版本庫,關閉apache、svnserve服務
2、成為版本庫的管理員,如果以其他身份還原版本庫,可能會改變版本庫文件的訪問權限,導致在恢復后依舊無法訪問
3、svnadmin recover /path/to/repos
4、重新啟動服務進程