2010-04-09 28 views
4

我有一個SVN倉庫,其目前的結構,像這樣:如何將非結構化SVN文件夾轉換爲樹幹/分支風格並保留歷史記錄?

/versions 
    /1.0.0 
    /1.0.1 
    /1.0.2 
    /1.1.0 
    /(etc) 

這裏發生了什麼是,當是時候開始新的版本中,團隊成員將使以前版本的文件夾的副本,並重新命名該文件夾;然後將該新文件夾添加/提交到SVN。

因此,給定版本文件夾的所有修訂歷史記錄僅限於該版本文件夾中所做的更改。 SVN認爲每個版本文件夾中的每個文件都是在版本文件夾創建時重新創建的。

所以我想做的是將這一系列的文件夾轉換成傳統的幹線/分支/標籤SVN結構。

是否有可能以某種方式將每個這些版本化文件夾的修訂歷史「重新調和」回到一個公共修訂歷史樹中?

回答

4

只是爲了澄清:當你說他們會添加/提交,你的意思是他們沒有做舊版本的svn副本到新的版本名稱,是否正確?基於假設我理解正確...

這可能嗎?是的,但沒有到位,也不容易。

我會這樣做的方式是編寫一個腳本,它會以您希望它們完成的方式重放提交,將新的repo轉儲到svn轉儲文件,使用svndumptool.py調整轉儲文件,自定義腳本來設置日期和作者等。

你也許能夠得到svn來幫助你一些。試試這種方法:

複製您的存儲庫,這樣您就可以使用該功能,而不會爲其他人造成混亂。然後,在該存儲庫中,創建/project/project/trunk,/project/tags/project/branches目錄。結帳項目/主幹。使用svn export將您1.0.0版本的第1版轉換爲您的主幹工作副本。使用svn log --xml獲取原始提交消息,使用svn add添加所有文件並提交。這給你你的原始起點。

現在,對於對您的/version/1.0.0所做的每個提交,將該更改集合併到您的新主幹中,使用svn log --xml提取提交消息,並提交。 將提交用完到1.0.0後,請從trunktags/1.0.0執行svn copy。然後使用svn merge --ignore-ancestry .../version/1.0.0 .../version/[email protected](其中xyz是1.0.1版本的第一次提交)。這應該會使您在發佈過程中發生任何更改。 (您可能需要試驗一下才能得到正確的結果。)

對每個剩餘版本重複該過程。

一旦你完成了這一點,你有一個在/project下有更好的歷史記錄的存儲庫,但仍然有在/versions下的舊的醜陋的歷史。要清理掉,使用svn dump project創建一個只包含新歷史記錄的轉儲文件。現在,您必須執行一些自定義腳本,並可能會使用svndumptool.py自由地修復轉儲文件中的提交時間戳記和作者,從svn log --xml輸出中提取該信息。您可能需要爲您所做的標記提交「發明」這些信息。

最後,使用svn load將該轉儲文件導入到新的存儲庫中。確認所有新的輝煌歷史看起來都很健全,然後繼續使用新的資源庫。

(哦,你會得到加分,如果你設置你的初始svn mkdir /project /project/trunk /project/tags /project/branches到1984年提交時間戳;))

披露:我已經促成svndumptool.py

3

我一直在這種情況下,我不認爲你想要做什麼是可能的,沒有一些繁重的svn之外。除非您真的需要擁有舊版本的線性歷史記錄,否則IMO最實際的做法是隻將(或者branches)目錄下的版本化文件夾移動到目錄中,並確保從現在開始正確標記版本。至少從每個版本開始就有變化的歷史。

+0

如果你真的想這麼做,你可能想看看ScummVM團隊從CVS轉移到SVN並執行類似的過程(因爲CVS在重命名中不保留歷史記錄)時所做的工作:http://wiki.scummvm。組織/ index.php文件/ CVS2SVN – 2010-04-09 22:43:23

相關問題