2014-01-30 54 views
1

我試過各種東西,並且只有一個工具可以正確執行它:來自TortoiseSVN的SubWCRev.exe。如何在UNIX上獲得正確的svn版本號?

svn infosvnversion都是笑話,並沒有提供良好的結果(所以,除非你確定他們可以這樣做,否則請不要發佈涉及這些問題的回覆)。

我在一個巨大的項目上工作,我維護我們項目的buildserver。 buildserver會進行稀疏結帳(例如,只有一些文件夾已經被我們的項目實際使用了)。我的目標很簡單:如果有人修改其他分支中的文件或不屬於我的稀疏結帳的文件夾,我不希望我的版本號出現問題。基本上,我的目標是確保相同的輸入文件將生成相同的生成結果(例如嵌入的svn編號應該相同)。來自tortoise的 SubWCRev完成此作業,並報告上次提交的所有檢出的文件的修訂。 svnversion -cn例如是一個接近嘗試,但它不能正常工作。

想象我有這樣的結構:

trunk 
    | 
    +-src 
    +-include 
    +-lib 
    | 
    +-Win32 
    +-Linux 
    +-WinRT 

lib文件夾中包含了不同的OS'es和平臺庫。例如,Win32超過了演出規模,而在Linux上我們做了一些稀疏的結帳,例如svn update --set-depth=exclude trunk/lib/Win32這種方式在我的linux buildserver上我甚至沒有看到trunk/lib/Win32。 svnversion -c的問題是,即使在排除的子文件夾中,它也會報告上次提交的rev。那麼,有沒有一種工具可以像來自tortoise svn的SubWCRev那樣工作(我不在乎它能夠替換文件中的標記,我需要的只是它提取的最後一個提交的版本號)。

回答

1

我不會說svn infosvnversion是他們只是包括目錄版本的笑話。包含目錄版本的原因造成了一個問題,原因在於Subversion bubbles up the revision of a changed node to the parent and their parents and so on。如果您將-f選項傳遞給SubWCRev,則其行爲方式可能與此相同。

碰巧有SubWCRev的* nix版本叫做svnwcrev。自從我構建在OS X上之後,我花了一點時間使用Makefile來爲它構建。我必須在config.mk文件的LIBRARIES行上提供-lapr-1 -lsvn_subr-1 -lsvn_wc-1。但它像廣告一樣工作。雖然它很古老,但Subversion API的版本規則意味着即使最新的庫(我碰巧在1.7版本中構建它)也是如此。如果你走這條路,遇到問題,請在這裏發表評論,我會盡我所能幫助你建立。

也有碰巧有一個叫做SvnRev的Java工具,它類似於SubWCRev(還沒有嘗試過,但我認爲它是做它承諾的)。我對這個建議的唯一擔憂是它似乎直接讀取了工作副本數據庫,這意味着它可能會在我們改變數據庫的格式時停止工作。

另一種方法是通過執行svn info --xml -R $WC本質上推出自己的產品,忽略所有具有kind="dir"的節點並計算提交實體中的最大修訂版本。如果我沒有找到上述內容,我可能會這樣做,但是編寫XPath代碼是一件痛苦的事情,我認爲最大函數不可用於xsltproc(這使得寫入更加惱人)。

如果你想看到這個集成到svnversion那麼我建議你要求一個選項,使其忽略[email protected]郵件列表上的目錄。考慮到有幾個公用事業公司可以做到這一點,他們似乎是在相當老,並沒有得到很好維護,我不認爲會有太多的反對增加這樣的選項svnversion。