2009-11-06 42 views
4

考慮將軟件分散在兩個單獨的存儲庫Pub和Priv中。 Pub存儲庫是公共的。 Priv已關閉。持續集成服務器在任何一方發生變化時都會構建Pub和Priv。然後,它會從Pubv的用戶可用的Priv創建可下載的二進制文件。這些二進制文件在內部進行了標記,並且在文件名上使用了Subversion版本。如何在每次提交時提交Subversion修訂以便在兩個存儲庫之間進行引用

問題是:如何讓Pub建立的程序知道正確的對應Priv修訂版號,以便它們可以自動下載並運行?

當前的解決方案是構建服務器修改Pub中的文件以設置Priv的修訂版本號並將這些更改提交到Pub。然而,這呈現2點顯著的問題:

  1. 構建需要很長的時間,所以,如果有人在生成過程中提交更改到酒吧(或私法),它會造成衝突。這可以被強制解決,但日誌歷史記錄看起來很奇怪,就好像這些修訂版本將它們放入該版本中一樣。

  2. 顛覆日誌有許多條目,如「自動構建更新版本」。從每一次構建運行,這會污染其他信息性的顛覆日誌。

所以我們可以這樣做,不需要更改存儲庫。

真誠, 韋恩

+0

你使用什麼CI?提交消息是「自動構建更新版本」。可在您的CI中定製? –

回答

0

我能想到的幾種方法可以做到這一點。我認爲由於某種原因,不可能使修訂號碼直接相互對應,這將是最明顯和最簡單的解決方案。

一種方法是使用Pub的提交消息來包含指向相應Priv修訂版的指針,如「對應於Priv r1234」。

另一種方法是將信件存儲在存儲庫之外,在一些簡單的數據庫甚至文本文件中,每當Priv的提交被推送到Pub時,都會更新。

還有一種方法是不像現在那樣做一個單獨的提交來記錄Priv修訂,而是將該更改添加到應該記錄的提交中。

1

您可以使用revision property(參見標題爲「未版本控制的屬性」一節)來存儲與Pub的相應修訂版相對應的Priv修訂版。修訂版屬性的好處在於它們不需要提交 - 因此不需要歷史污染

修訂屬性,以Subversion的說法,是附加到一個特定的版本而不是版本化的文件夾,這些屬性不像附加到文件或文件夾的屬性,是非版本化的。修改屬性是通過使用--revprop開關添加到「svn propset」添加的,在TortoiseSVN中,它們通過歷史日誌添加(右鍵單擊修訂版然後選擇「顯示修訂版屬性」),而不是文件屬性或文件夾,並立即應用而不用提交。

例如,要將Priv的r1234與Pub的r6789關聯,您可以從Pub的結帳中執行此操作。

svn propset --revprop -r6789 "priv:version" "1234" 

現在,當酒吧的r6789是建立可以做到這一點

svn propget --revprop -r6789 "priv:version" 

檢索私法的適當的版本號。爲了應付在最後一個Priv構建之後發生的其他提交,您的腳本將不得不「沿着歷史」向下「詢問每個修訂」priv:version「,直到獲得一個值。或者你可以有一個post-commit鉤子,它在每個修訂版本發生時拷貝屬性。

儘管如此。您需要有一個pre-revprop-change鉤子,以便您可以使用修訂版本屬性。最簡單的方法是讓它始終返回0,以便允許任何revprop。在Windows上,我只是在鉤子目錄中創建一個空的「pre-revprop-change.bat」文件。如果您查看創建屬性時提供的示例鉤子腳本,它實際上已經很好地記錄了。

0

對不起,stackoverflow不允許回覆或編輯我的帖子我自己或您的答案,因爲我沒有註冊時,我問這個問題。所以這裏有迴應...

Simon:謝謝。爲什麼你建議修改屬性不需要提交? nant構建腳本目前使用修訂屬性來跟蹤合併和重新集成的分支版本(svn的內置合併能力太容易混淆了)。但是這些版本屬性需要提交到中央存儲庫,並且您的鏈接引用了與此相同類型的版本屬性。你是指一些其他類型的版本屬性?

關鍵技巧:是的,提交「Autobuild更新到0.5.6.1049版」的消息是可定製的。該提交實際發生在由Hudson使用CI執行的nant構建腳本中。並且,請記住,我們希望消除該提交,因爲每次對Pub提交後都會有一個(或多個)那些會污染日誌的自動消息。

Mark:re:提交指向Priv的指針。承諾發佈的用戶對Priv的訪問權限爲零,因此他們不知道什麼版本 - 否則是一個好主意。另一方面,自動構建現在可以在構建pub和priv時執行此操作,但是會使用大量自動提交來污染日誌文件,只是將其他任何實質性更改的版本鏈接到Priv。 Mark:我們考慮將對應關係存儲在存儲庫之外,但這會導致另一個我們無法解決的問題。解決這個問題,你贏得了答案。問題在於,pub存儲庫保存的軟件取決於從Priv和完全相應的版本構建的二進制文件。所以它包含了一個「自動更新」功能,它連接到服務器上,並持有Priv並請求二進制文件並下載它們。關鍵是開始下載的主要參數是版本。

馬克:所以問題是酒吧怎麼知道要下載哪個版本?現在,通過原始問題的情況解決了這個問題。自動生成的nant腳本會對Pub中的源代碼進行更改,以包含Priv的版本號,但這是用「Auto build updated the version ..」自動生成Pub日誌的原因。自動更新工具使用該版本,如果有權從Web服務器請求Priv二進制文件。它一切正常。

Mark:第一個問題似乎可以通過切換關係來解決,Pub軟件使用版本自動更新 - Pub版本,Web服務器使用單獨的文件獲取最新的匹配版本的Priv二進制文件。然而,低看,似乎沒有實用的方法讓Pub軟件知道每個提交的版本。Mark:如果您在自動更新代碼中添加了$ Rev $關鍵字,它只會更新它修改過的文件。這似乎是Subversion工作中的一個「古老的」挑戰。看起來預提交鉤子可以用一個版本更新源代碼,但似乎只有某人提交了有問題的自動udpate源文件。

馬克:你最後的想法有點令人困惑,但它聽起來像剛纔提到的那樣包含版本信息並提交給Pub,而不是另外提供一個自動提交。我喜歡這一點,但無法弄清楚(谷歌搜索和閱讀論壇和帖子超過一天後)。對於如何提交項目範圍版本以及任何對Subversion的普通提交,這似乎是一個共同的挑戰,因爲它只是單獨版本文件。即使你在pre-commit hook中使用svnversion,它也只會更新修改的文​​件,對嗎?那麼,自動構建源代碼在運行時如何知道它的版本?

大家好:感謝大家的提問和回覆。它有助於縮小對問題的理解,以便我們能夠達成解決方案!所以。太酷了!

+0

我已經編輯了我的答案,以擴展一些我(和Subversion本身)稱爲修訂屬性的內容。我認爲這種混淆源於Subversion實際上有兩種屬性,我鏈接的頁面並不好。只要我在網上找到更好的解釋,我會鏈接到。 – Simon

+0

謝謝。但是,雖然這可以解決日誌消息的問題,但它會失去版本控制能力,因此Pub的源代碼的以前版本將無法跟蹤它們在Priv中匹配的版本。 在Subversion中連接兩個存儲庫看來我們不能贏。但是,必須有一種方法。 – Wayne

+0

看來答案是GIT。 GIT使用項目範圍的版本控制,而不是像SVN那樣的文件版本控制。它與SVN集成,因此我可以在內部使用GIT連接到Priv和Pub SVN存儲庫並更好地管理關係。 嘿,我從閱讀其他人這樣解決同樣問題的例子和git文檔中收集了所有這些內容。 但還沒有嘗試過。韋恩, – Wayne

相關問題