2011-11-30 116 views
1

在用git進行web開發的工作流程之後,我一直被委託在最後一秒添加一個臨時服務器。我們在本地進行開發/測試並推出回購協議,現在需要在兩者之間建立一個沙箱,以便其他部門的人員可以在周圍玩耍並嘗試新東西而不會破壞內容。部署git分支

遠程回購需要兩個長期運行的分支(本着nvie分支模式的精神),掌握和發展。

我們需要能夠推到一個回購協議,並檢出開發分支test.site.com文檔根目錄,並在準備好時,合併發展成主機和結賬掌握到site.com文檔根目錄

所以上服務器...

git init 
git add . 
git commit -m "Initial commit" 
git checkout -b "develop" 

而且我們本地機器...

git clone [email protected]:/repos/repo1.git 
??? 
git push origin/develop (??? Updates test.site.com docroot) 

而回服務器,以使代碼直播

git checkout "master" 
git merge develop (??? Updates site.com docroot) 
git checkout -b "develop" 

和當地

git pull 

幫助與讚賞問號或其他建議。

編輯: 正在嘗試一些迄今爲止的答案。在過渡時間裏想出了一個徹頭徹尾的想法,並認爲我會分享:

一個post-receive hook來統治它們。

我們克隆裸露的回購和跟蹤發展。推動發展/發展。

後接受 - 設置GIT_WORK_TREE到test.site.com,結賬-f發展

如果提交信息中包含 「merge_master」,設置GIT_WORK_TREE到文檔根目錄site.com,

git checkout master 
git merge develop 
git checkout -f master (this would be for hotfixes) 

合併掌握本地發展和拉動

在塵埃落定之後,發送電子郵件difflog,擰你的手,並have一口強。

有多少種不同的方式可以打破?

+2

你見過嗎? http://nvie.com/posts/a-successful-git-branching-model/ – kan

+0

是的,這實際上是我最初被介紹給git的。分支不像現在部署那樣是個問題。我確實喜歡兩個長期運行的分支的核心思想。 – James

回答

1

我的建議是讓兩個docroots都是git工作副本。

此之後,你有兩個選擇

  1. 有cron作業做類似git fetch development-repo; git reset --hard development-repo/branch兩種。我之前做過這樣的事情,而且硬重置是必須的:它會以任何方式破壞隨意更改到您的文檔根目錄的任何更改。
  2. 在開發回購中有一個post-update掛鉤,每次有人推送某物時都要做上述操作。不幸的是,我手頭沒有這方面的例子。
2

在git中,您通常不會推送到具有簽出的存儲庫。完全一樣。你可以推送到一個,但你不能推送到檢出分支,但你通常不應該。主要是爲了使事情明確分開,並避免在Web服務器崩潰並需要修復時中斷中央存儲庫。

所以,你應該有一個(用於存儲庫沒有工作樹的術語)中央存儲庫。每個人都將使用該存儲庫。它應該存在於你的內部網絡上,不應該在公共服務器或測試服務器的文檔根目錄下。事實上,我強烈建議不要把它放在任何一臺服務器上,而是分開(可能是虛擬的)機器。

現在你有了網絡服務器。它們可以是工作副本,也可以是僅使用git archive創建的導出,並且可以通過中央存儲庫中的cron或post-update鉤子進行更新。

工作副本是由git fetch central-repo-url mastersite.com服務器上更新和git pull central-repo-url developtest.site.com服務器上(確定,取+在其他答案建議復位可能是更好的,因爲你是確保你不會有任何改變那裏)。

導出通過獲取帶有git archive的zip或tar包進行更新並解壓縮。這是一個更多的工作。

Cron只是定期運行命令。設置起來更容易,但缺點是推送與服務器上顯示的內容之間存在延遲。

post-update鉤子設置起來比較複雜,但沒有延遲(因爲下載數據需要一些時間,所以顯然有一些延遲)。基本上你創建一個腳本來運行更新,可以通過服務器上的ssh或web請求觸發。與在中央存儲庫中放置腳本hooks/post-update相比,這會觸發服務器上的腳本。應該沒有辦法給它們任何參數,並且出於安全原因,該機制不應允許運行除這些腳本以外的任何其他代碼。您可以通過查看哪個分支被推送(請參閱git doc找到它的位置)並僅觸發正確的服務器來使鉤子更高級。

git push origin develop將導致test.site.com進行更新(但間接地,通過腳本)並且使代碼住你會做(開發機器上;!從未在服務器上的工作)

git的結帳主 混帳合併開發 混帳推起源主

最後命令將導致site.com通過腳本間接地更新一次。