2015-07-11 23 views
0

作爲一名軟件開發人員,我有一個大型項目,其代碼存儲在Subversion®存儲庫中。多年來,我對代碼進行了多次重構,並將其戲弄到由各種組件組成的模塊化體系結構中。一個組件已經成熟到它本身應該是一個獨立的項目。解析`svn log`的輸出,僅列出某個文件歷史記錄的以前版本的路徑

我希望該組件的代碼位於新的獨立Subversion®存儲庫中(可能會被遷移到git存儲庫中)。但是,我還希望保留該組件中所有文件的版本歷史記錄,以便我可以讀取日誌並提交解釋如何以及爲什麼會以當​​前格式顯示的消息。

我已經創建了一個現有存儲庫的轉儲,並且希望使用svndumpfilter來清除轉儲文件中可以導入到新存儲庫(使用svnadmin load)的所有提交選擇集。

由於svndumpfilter documentation的倒數第二段建議,我打算使用svndumpfilter上的include選項來列出我希望保留在新存儲庫中的路徑。

報價:

這可能是在你的倉庫的生命週期的某個時刻,你可能已經複製從svndumpfilter排除的一些位置的文件或目錄,以它包括的地方。爲了使轉儲數據自給自足,svndumpfilter需要仍顯示新路徑的添加(包括由副本創建的任何文件的內容),並且不會將該添加表示爲從您的源中不存在的副本的副本已過濾的轉儲數據流...

...如果您懷疑在存儲庫中有此類副本,則可能需要重新考慮包含/排除路徑的集合,可能包括用作源的路徑你的麻煩複制操作也是如此。

這意味着,當我們運行通過過濾器的新項目,以維護他們犯下的歷史,我們不僅要include項目文件在當前的修訂,也include他們祖先的路徑。

現在的問題是:我們如何確定這些祖先的路徑?

可以在存儲庫url上運行svn log命令。這將返回其提交歷史記錄。使用--verbose選項可確保我們可以看到受該歷史記錄中任何給定提交影響的路徑。

當文件被修改時,我們可以忽略occassions。我們真的很感興趣追溯歷史,直到該文件被svn添加到存儲庫。此外,如果使用svn-copy(或任何有效的svn-move)命令添加了該文件,我們也想跟蹤該「源文件」的祖先。

該信息全部在svn log的輸出中。

--xml選項以xml格式打印svn log輸出。這使機器更容易理解它。

我需要的是一些工具或技術,用於從給定存儲庫文件上的svn log命令輸出的xml流中提取相關的祖先路徑數據。

如果要爲要解壓縮的項目中的每個文件執行此操作,那麼我們可以構建一組需要包含在svndumpfilter進程中的路徑,以便過濾轉儲文件。

這樣的工具或解決方案是否已經存在?

如果是這樣,我會很感激,如果你能讓我知道這件事。

如果解決方案不存在,我打算編寫一個小命令行界面(CLI)程序來解析XML。 See the project write-up on github

我不喜歡'重新發明輪子',除非有必要,所以你的幫助表示讚賞。

+0

我最近有一個類似的要求,目前我唯一能找到的是http://subdi.vision/extract/,但是我沒有測試它,因爲它很昂貴。也許可以幫助別人。 – ravisorg

+0

謝謝@ravisorg - subdi.vision/extract功能幾乎是我一直在尋找的。我認爲我的修訂版本超過了2000個,因此還需要爲高級版本付費。我可能會玩免費版本來測試它。如果是這樣,我會回報。 –

回答

1
  1. 我不知道在野外網這樣的工具(我想每個人都「重新發明輪子」使用自己喜歡的工具)
  2. 我想,你也可以處理非XML的svn log FILENAME(減少噪音)輸出

用一些樣品(一點點fefactored)玩具回購在HEAD狀態

>svn ls -R 
API/ 
API/intefaces.txt 
Core/ 
Core/core-classic.txt 
Modules/ 
Modules/modules-classic.txt 

與這種短的歷史

>svn log -v -q 
------------------------------------------------------------------------ 
r5 | Badger | 2015-07-12 20:58:23 +0500 (Вс, 12 июл 2015) 
Changed paths: 
    A /trunk/API/intefaces.txt (from /trunk/inteface.txt:4) 
    A /trunk/Core/core-classic.txt (from /trunk/core.txt:4) 
    A /trunk/Modules/modules-classic.txt (from /trunk/modules.txt:4) 
    D /trunk/core.txt 
    D /trunk/inteface.txt 
    D /trunk/modules.txt 
------------------------------------------------------------------------ 
r4 | Badger | 2015-07-12 20:55:29 +0500 (Вс, 12 июл 2015) 
Changed paths: 
    A /trunk/API 
    A /trunk/Core 
    A /trunk/Modules 
------------------------------------------------------------------------ 
r3 | Badger | 2015-07-12 20:53:36 +0500 (Вс, 12 июл 2015) 
Changed paths: 
    D /trunk/a.txt 
    D /trunk/b.txt 
    D /trunk/c.txt 
    A /trunk/core.txt (from /trunk/a.txt:2) 
    A /trunk/inteface.txt (from /trunk/c.txt:2) 
    A /trunk/modules.txt (from /trunk/b.txt:2) 
------------------------------------------------------------------------ 
r2 | Badger | 2015-07-12 20:50:40 +0500 (Вс, 12 июл 2015) 
Changed paths: 
    A /trunk/a.txt 
    A /trunk/b.txt 
    A /trunk/c.txt 
------------------------------------------------------------------------ 
r1 | Badger | 2015-07-12 20:47:11 +0500 (Вс, 12 июл 2015) 
Changed paths: 
    A /branches 
    A /tags 
    A /trunk 
------------------------------------------------------------------------ 

如果還原歷史,f.e. Core DIR爲XML,而不是-XML日誌,你必須約爲執行相同的操作量

>svn log Core -q -v | grep A | grep Core | grep from 
    A /trunk/Core/core-classic.txt (from /trunk/core.txt:4) 

(在「從」邊遞歸地重複每一個路徑的一部分)

,或者對於XML日誌(日誌的無關部分修整)

>svn log Core -q -v --xml 
... 
<paths> 
... 
<path 
    text-mods="false" 
    kind="file" 
    copyfrom-path="/trunk/core.txt" 
    copyfrom-rev="4" 
    action="A" 
    prop-mods="false">/trunk/Core/core-classic.txt</path> 
... 

(解析有趣路徑中的每個路徑節點,提取從copyfrom-path鍵源路徑,重複與新提取的路徑登錄)

+0

謝謝。這是一些非常有用的信息。 –

相關問題