2011-01-06 28 views
5

在每次提交到'trunk'之後,我們會自動運行一系列針對trunk的測試。當這些測試通過時,我想自動合併到一個名爲'tests-passed'的分支中。當測試失敗時,不應該發生合併,但是一旦問題在下一次或稍後的提交中被固定在「trunk」上時,所有更改都應該合併。如何在自動化測試通過時自動合併svn?

關鍵是要有一個與trunk相同內容的分支,但這比「trunk」更加理智,因爲至少自動化測試已經過去了。

我有一個腳本,試圖手動做到這一點,但它是一個使用自定義屬性,並不總是正常工作 - 如我剛剛發現的。我如何最好地使Subversion做到這一點?

+0

您打算如何處理合並衝突? – Steve 2011-01-06 19:36:22

+1

我不認爲應該有任何合併衝突:'測試通過'始終與'trunk'具有相同的內容,除非'trunk'上的HEAD未通過測試,在這種情況下,它具有與最後一次測試通過的'trunk'。 – 2011-01-06 20:03:14

回答

5

運行這些命令在測試,通過了,只要你已經確定了新的樹幹修訂版<somerev>已通過測試的工作副本根:

svn update 
svn merge http://example.com/svn/myproject/trunk -r 0:<somerev> 
svn commit -m "merged trunk revisions up to <somerev> into tests-passed" 

每當你使用合併命令,SVN會記錄合併在svn:mergeinfo財產。因此,上述命令應自動確定0:<somerev>範圍內的哪些修訂版本可以合併,排除已完成的任何合併。

就像你在評論中說的那樣,衝突不是預期的。但是,有時候我會看到在合併包含重命名的一系列SVN修訂版時出現意外衝突。要擺脫這些衝突,您可以使用merge命令的--accept theirs-full選項始終接受中繼狀態。

0

我會想象使用測試套件來做到這一點。

根據我的經驗,我會運行一個ANT腳本來測試我的代碼,並且如果測試成功,最後有條件執行分支。

+0

我們確實用螞蟻進行測試,並且我們有最終的條件,就像你說的那樣。問題是:如何讓svn根據該條件進行正確的合併? – 2011-01-06 19:55:33

+0

你們是否在每一個新代碼中都使用Name_spacing。 (code_ versioning)可能有助於這種情況。 – NaV 2011-01-06 20:12:35

1

您可以爲此使用連續集成工具。一個很受歡迎:哈德森

http://hudson-ci.org/

您可以編寫腳本這種行爲的存在。