2010-03-23 20 views
3

我有一個網站,我定期更新代碼。我把它保存在版本控制中。當我想部署新版本的站點時,我會執行導出,然後將提供的目錄名稱與部署的目錄進行符號鏈接。php,用戶上傳的文件,版本控制和網站部署

有一個地方,用戶可以上傳文件,我注意到,一旦我部署了新版本後,用戶文件就不見了!當然,我沒有將它們添加到存儲庫中,並且由於所提供的站點來自導出,所以它們不會上載到版本控制的目錄中。

PHP尚未集成svn功能,所以我無法通過編程方式對用戶上傳的文件進行很多操作。我的解決方案是創建一個額外的網站files.website.com,它位於並行目錄中的服務器網站,並在受版本控制的目錄中提供。這樣,當我升級到網站時,它們不會被消除。有時,我手動將上傳的文件添加到svn項目中,刪除用戶刪除的文件,並提交新版本。我正在研究一個shell腳本來從cron運行來執行此操作,但這不是我的專長,所以它在後退上,因爲它不是一個迫切的需求。

有沒有更好的方法來做到這一點?

回答

4

我通常不會保留用戶生成的數據/文件在svn。只有代碼,db架構/測試數據。我通常部署的是從最新的工作副本中的rsync,它不包括上傳目錄和.svn目錄。 IMO內容應該由更傳統的文件系統/數據庫備份機制處理,而不是版本控制。

編輯:

只是要清楚你的符號鏈接策略似乎是一個很好的做法。你是否錯過了它認爲的備份部分。 Id可能只是tar | gzip在cron作業中上傳的東西,而不是與SVN交互。然後可能有一個單獨的使用mysqldump轉儲數據庫和gzip以及。

4

我會繼續導出網站的做法,因爲需要升級,但有一個符號鏈接到版本控制目錄之外的目錄,並帶有用戶上傳的內容。通過這種方式,當您執行導出時,只需重新創建符號鏈接即可。當然,您應該根據需要備份該用戶內容。

0

而不是手動執行導出和管理符號鏈接,您可以使您的部署目錄成爲顛覆性檢出(從生產分支)。這樣,部署就像檢入更新到生產分支一樣簡單。

只要你有足夠的控制你的Subversion服務器和託管設置,並且你的Subversion版本庫「準備好運行」,它就可以工作。在這種情況下,您的用戶目錄可能是一個在Subversion中的空佔位符,並且會由提交時運行的更新過程獨自保留(svn update的業務照常)。我仍然建議(如@ Flash84x和@prodigitalson所提到的)一個單獨的過程來備份用戶內容。

有一個Ars Technica article與說明如何設置它。

更新:如果您遵循此方法,請確保您的Web服務器不允許訪問部署結帳中的.svn文件。

+0

是的,但管理符號鏈接的一個好處是,我可以立即回滾到以前的實時版本,只需更改符號鏈接即可。 – user151841 2010-03-25 17:35:54

+0

@ user151841:你也可以做一個反向合併來完成相同的'svn merge -r HEAD:$ PREV_REV $ SVN_URL' grantd改變鏈接更簡單:-) – prodigitalson 2010-03-26 02:48:43