2009-12-17 79 views
6

我們很難保持Subversion和FTP同步。有時我們忘記提交更改並將它們推送到Web服務器,我們有分散在我們Web服務器中的.svn文件夾,有些東西存在一個地方,而另一個地方不存在,等等。如何讓Subversion和遠程服務器(通過FTP)保持同步?

我想採取今天解決這個問題的時候了。解決辦法是什麼?有沒有一種方法可以將SVN鏈接到我們的Web服務器,以便我們可以通過FTP提交到存儲庫和Web服務器?我們是否應該問我們的網絡主機是否有其他可以更好地與SVN存儲庫同步的系統?我們如何強制存儲庫和Web服務器都同步?我們如何刪除.svn文件夾?

正如標題所示,如何讓我們的SVN存儲庫和我們的Web服務器保持同步?

回答

6

我在我的服務器上做的是讓它成爲服務器上代碼的簽出。

因此,我只是登錄到服務器,然後運行一個svn up,而不是使用ftp將內容推送到服務器。通過以這種方式手動執行此操作,您將獲得多項好處,包括在發生錯誤代碼時能夠回滾。

我還建議使用數據庫遷移系統(假設您使用的是數據庫)。這將允許您輕鬆回滾數據庫模式更改,以確保您的代碼在回滾事件中繼續工作。

將這些與類似於FabricCapistrano的工具組合使用,將爲您提供一個非常強大且功能強大的部署系統。

備註DVCS:

這裏的一些人已經開始使用一個distributed vcs提及。其中一些最流行的例子是gitmercurial(還有其他幾個)。

這兩者都有不同於svn的使用模式,但這並不直接適用於這個問題。你可以在這裏獲得的最大收益是,如果你爲每次推送到活動服務器的標籤做了標籤,與svn的傳統標籤模式相比,這樣做的代價是微不足道的。

如果你想和這兩個GitHubBitBucket來expirement都提供託管分別gitmercurial免費存儲庫。

這就是說我是我使用dvcs的巨大支持者,我個人的偏好是mercurial

+0

如果你這樣做,一定要拒絕訪問SVN元數據或者你可能會引入一個安全問題。更多信息:http://www.smashingmagazine.com/2009/09/25/svn-strikes-back-a-serious-vulnerability-found/ – 2009-12-17 15:43:52

+0

這是真的。我並不總是需要處理這個問題,因爲我的大多數網站都是使用python,因此原始文件從不以它們可以提供的方式進行設置。 – 2009-12-17 15:46:44

0

設置一個更新FTP並專門使用SVN進行更改的post-commit hook。這樣當提交更改時,您的Web服務器將被更新。

這裏假定網絡服務器是登臺服務器。詳情請參閱評論。

+1

這通常是一個糟糕的主意,就好像你將破損的代碼提交給倉庫,它將立即生效,或者很快出現。這將是一件「壞事」。 – 2009-12-17 15:42:02

+0

或者,也許這與@Bryan McLemore的答案相結合,建立一個post-commit鉤子觸發服務器上的svn更新..嗯... – Ricket 2009-12-17 15:42:37

+0

不,它不會是一件壞事。您應該更新登臺服務器。爲穩定版本使用標籤並手動將其推送到生產服務器。 – 2009-12-17 15:43:32

-2

這看起來像是針對分佈式版本控制系統量身定製的問題。

+0

爲什麼?你能多解釋一下嗎? – Ricket 2009-12-17 15:50:10

+0

我看不出分配與它有什麼關係。有幾個人提供了與svn或任何其他不受歡迎和不酷的常規舊式風格的解答,而不是最酷,最時尚的git存儲庫。 – Tim 2009-12-17 16:00:13

+0

@Ricket:我在DVCSs的答案中加了一個註釋 – 2009-12-17 16:01:26

8

你不想在沒有任何形式的測試的情況下提交實時Web服務器的更改,對嗎?

簡答題:通過執行新的檢出(最好在中央服務器上)並僅複製運行應用程序所需的位。

我建議設置continous integration,其中您的構建服務器負責從Subversion存儲庫中檢索最新的源代碼,爲各種環境(測試/分段)執行構建和準備部署包,並可能將其FTP'ing一旦您對測試或臨時環境中已部署的更改感到滿意,請將其添加到生產環境中。

這是確保必須承諾進行更改的唯一可靠方法(我知道這很簡單,但似乎在您的方案中不確定),否則它們不會在部署中結束。它強制執行良好的發佈管理流程,不要忘記你可以添加各種其他美妙的自動化東西到你的構建服務器,如單元測試和功能測試。

+0

值得注意的是,持續集成周期並不總是最有意義的。許多Web語言甚至不支持構建階段。雖然有一個腳本抓取測試服務器發現錯誤對於某些語言來說可能是無價的。 – 2009-12-17 15:56:49

+0

當然,但您可以通過至少有一箇中央盒子來執行這樣的構建服務器行爲,這個盒子可以執行常規檢出並將相應的構件和相關配置文件複製到drop文件夾,在那裏它們準備好被拾取並且可以是FTP' d。它不需要是昂貴的,過度工程的解決方案。它可能是幾個批處理文件。但這與100%的「持續整合」概念是一致的。 – 2009-12-17 16:02:08

+0

這是事實,不管形式如何,自動進行儘可能多的理智檢查都是至關重要的。 – 2009-12-17 16:04:37

0

我發現這樣做的最好方法是確保沒有任何未提交的內容可以轉移到服務器 - 這是您必須首先修復的漏洞。

然後,設置您想要同步的存儲庫部分的本地簽出,並使用rsync將數據推送到服務器(在這種情況下,FTP確實沒有那麼有用)。 rsync允許您排除文件和目錄,以便使用該功能確保.svn目錄不會同步。

2

我建議在執行之前,您可以使用可以直接FTP的測試環境,然後推送活動,提交該版本的文件並允許此任務運行。

tigris

這樣做是所有的時間,並且很容易被添加post-commit鉤子腳本到存儲庫來實現的。閱讀本書第5章中的鉤子腳本。基本的想法是讓「活網站」只是一個普通的工作副本,然後讓你的提交後腳本腳本運行「svn update」。

實際上,有幾件事值得注意。執行提交(svnserve或apache)的服務器程序與將運行提交後腳本腳本的程序相同。這意味着該程序必須具有更新工作副本的適當權限。換句話說,工作副本必須由svnserve或apache運行的同一用戶擁有 - 或者至少工作副本必須設置適當的權限。

如果服務器需要更新它不擁有的工作副本(例如,用戶joe的〜/ public_html /區域),一種技術是創建+ s二進制程序來運行更新,因爲Unix贏得了'允許腳本運行+ s。編譯一個小C程序:

#include <stddef.h> 
#include <stdlib.h> 
#include <unistd.h> 
int main(void) 
{ 
    execl("/usr/local/bin/svn", "svn", "update", "/home/joe/public_html/", 
    (const char *) NULL); 
    return(EXIT_FAILURE); 
} 

...然後使用chmod + S中的二進制文件,並確保它是由用戶 '喬' 擁有。然後在提交後的掛鉤中,添加一行來運行二進制文件。

如果您在啓用掛接時遇到問題,請參閱「爲什麼我的存儲庫掛鉤不工作?」。

此外,您可能會想要防止apache導出實時工作副本中的.svn /目錄。將此添加到您的httpd。CONF:

# Disallow browsing of Subversion working copy administrative dirs. 
<DirectoryMatch "^/.*/\.svn/"> 
    Order deny,allow 
    Deny from all 
</DirectoryMatch> 
5

Springloops不正是你所需要的。搏一搏。它是SVN和FTP的結合。您在本地工作副本上工作,然後將更改提交到存儲庫,然後通過Springloops通過FTP將選定的修訂部署到任何服務器(分段或生產)。

0

我剛剛建議Springloops,當我向下滾動並看到克里斯的建議。過去幾個月我一直在使用SpringLoops,絕對喜歡它。

您可以爲每個存儲庫設置登臺和prod服務器的FTP詳細信息。然後,您可以通過FTP發佈到這些服務器,指定要部署的修訂版本號。

我真的很喜歡這件事,我可以通過Springloops中的部署頁面瞭解每個服務器的版本。通過Springloops部署所有的東西,你知道這是準確的。

我實際上一直在尋找的解決方案不僅僅是一個SVN存儲庫..一些集成票務,維基和計時。我很喜歡Bitbucket,但它不具備Springloops的FTP部署功能,這對我來說很不幸。現在我會堅持使用Springloops,直到另一個服務可以提供FTP部署。

爲什麼FTP部署對我來說如此重要我聽到有人在他們的呼吸下喃喃自語......我很樂意告訴你:我部署到各種不同的服務器。一些是專用的盒子,一些雲託管的虛擬機,以及一些共享主機。我不希望爲每一個維護一個單獨的部署方法,所以所有的通用部署方法都是FTP。 Springloops在我的源代碼和我的服務器之間非常好。這就是爲什麼:)

+1

啊,忘了提,Beanstalk也是從SVN倉庫進行FTP部署。哦,Beanstalk提供Git託管服務,如果這是您的偏好。 – Jeeby 2010-10-01 00:56:38

1

嘗試http://svn2ftp.com - 沒有項目管理批量,你可以簡單地設置SVN倉庫,它會自動同步到每次提交的任意數量的S/FTP帳戶。

+0

+1,即使這需要您使用他們的託管解決方案 - 並不理想。 – bentford 2011-07-30 00:24:34

相關問題