2011-01-19 38 views
9

我目前在我的託管的Web服務器上有一個svn存儲庫。我在本地工作,將我的更改提交到服務器上的存儲庫,然後在準備好推送更改時,在我的活動文件夾中通過ssh運行「svn update」。使用SVN與分段和實時網站

我現在正在添加一個暫存站點,它將駐留在同一臺服務器上。它只是在同一臺服務器上的另一個文件夾。

問題是,我將在臨時服務器上對網站進行較大的更改,這可能需要長達一週的測試時間。在此期間,我可能想對現場不需要測試的情況下做一些小的改動。讓我們舉個例子:

  1. 假設我的地方,分期,和現場所有的網站上開始修訂1.
  2. 我做本地發生重大變化,其中提交和更新我的臨時服務器。本地和分段正在修訂版本2中,直播仍在1.
  3. 有人要求在實況網站上進行簡單的文本更改。
  4. 呃。現在我必須將我的本地副本恢復到版本1,進行小的更改並提交它。現在我更新到現場,以修訂版3,它有一個小的變化。
  5. 我想繼續研究我的主要更改,因此我將本地副本更新回修訂版本2,並繼續工作。
  6. 等等....

這迫使我跟蹤revsions的不斷更新是恢復和。有沒有更好的辦法?我覺得我應該在這裏使用分支和標籤,但我不明白具體如何。

感謝, 約拿

回答

9

我管理一個由5位開發人員組成的開發商店。我們利用SVN在我們網站上的方式如下:

  • 開發商標誌工作作爲完成之前提交所有的改進和bug修復我們的「開發」分支。
  • 作業在運行dev分支中最新代碼的臨時框上進行測試。
  • 工作通過測試後,該工作的修訂將合併到我們的幹線分支。
  • 我們的實時網絡服務器運行中繼分支。它們通過一個'發佈'腳本定期更新,它可以更新實時服務器上的SVN並做一些其他的事情(比如混淆和最小化CSS和JavaScript)。

這可以讓小的錯誤快速通過管道,而更大的工作需要儘可能多的時間來開發和測試。

由於每個開發人員都負責合併他們自己的工作,而且每次合併都由一組較小的代碼更改組成,他們會相當順利。與之前的合併管理器爲一組增強功能創建主要增強分支的舊模式相比,它要少得多。由於其他開發人員通常在一組增強功能上一起工作,因此最終會有合併經理合並他們沒有寫入的代碼,這在合併衝突時變得特別令人沮喪。

實際上,這種方法反映了像Git和Mercurial這樣的版本控制系統試圖通過它們如何構建它們的存儲庫來提升的方法。使用這些版本控制系統,每個開發人員都有自己的「本地」存儲庫。當他們想要從另一個「存儲庫」進行更改時,他們必須將它們與本地代碼合併,然後提交有效的「合併」版本。

您也可以使用標籤,正如Andy在他對此問題的回答中所述。它可能適合你,但我更願意將合併的責任交給編寫代碼的開發人員,而不是中央高級開發人員或發佈經理。他們傾向於這樣更順利。

1

正如你已經確定要做到這一點的最好辦法是使用分支和標籤。如何做到這一點的一個很好的例子如下。

主要開發

  1. 你做在樹幹上的重大發展。
  2. 每當您發佈軟件的一個副本時,您都會從主幹創建一個標籤,並將您的網站切換爲指向新標籤。

當你需要做一個小變化的生活,你現在可以做到以下幾點:

  1. 從創建活動代碼的一個分支,在這裏做的工作。
  2. 一旦您對此更改感到滿意,您可以從此分支中創建一個新標籤並將您的實時工作副本切換到新標籤。
  3. 您也可以將此更改從分支合併到trunk中,以便此更改也在您的下一個主要版本中。

有顛覆一個很好費的書,解釋這一切在這裏痛苦的細節:

http://svnbook.red-bean.com/

如果你能找到的時候我強烈建議讀。

+0

Andy,我在我的latptop上使用的實際本地副本是否會不斷從一個分支更改爲另一個,具體取決於我正在從事的工作? – Jonah 2011-01-19 19:29:57

+0

使用Andy的方法,您需要創建並更改本地系統上的一個新分支,以進行每次小的更改,然後將其合併。您的主要更改將發生在主幹中,您將通過標記主幹來「釋放」,然後將生產服務器更新爲該標記。 – Shaun 2011-01-19 19:31:54