2011-04-22 67 views
2

我對Git只有一點新意,我只用它來進行基本的項目和簡單的設置。現在我正在努力將自己的頭圍繞更復雜的設置。我一直在搜索谷歌搜索,但我無法找到任何與我想如何設置相關的內容。Git根據分支推送自動推送到中央存儲庫的開發和生產

我在我的網絡上有三臺服務器:一臺用於開發(dev.example.com),一臺用於生產(www.example.com),另一臺充當中間階段(central.example.com) )。

我想創建一個主要的(可能是裸機的)Git倉庫,我可以從我的本地機器(它與三臺主服務器分開,但在同一網絡上)推送到中央。理想情況下,這個回購將有兩個分支:主和發展。我的本地機器只能處理Central的這個回購。

當我推送到Central上的開發分支時,Central應該將這些更改推送到DEV服務器。同樣,對主分支的更改應推送到WWW。我認爲使用提交/更新掛鉤將是完成此操作的最佳方式。

這裏是一個粗略繪製圖:

Local 
    | 
Central 
/ \ 
DEV WWW 

可能有人親切地指出我在正確的方向?謝謝!

+0

我碰到了[this hook](https://gist.github.com/634631),看起來它可以讓我推送到一個非裸存儲庫,或者換句話說WWW和DEV。有什麼異議? – 2011-04-22 15:55:47

+0

這篇文章:http://blog.ekynoxe.com/2011/10/22/git-post-receive-for-multiple-remote-branches-and-work-trees/解釋得非常好 – tver3305 2012-08-07 13:43:21

回答

3

您必須使用post-updatepost-receive掛鉤;它們是在推送到存儲庫完成後運行的。他們之間唯一的區別是他們如何得到論據。

比我建議使用SSH觸發生產/登臺服務器TU從那裏運行一拉,這是因爲:

  • 您需要反正那裏運行一些代碼,因爲推入混帳不支持檢查遠端的推送版本。所以你需要另一個鉤子。
  • 在那裏進行推送意味着允許推送訪問,這意味着還有一件事要保護。另一方面,ssh觸發器會將硬編碼分支拉出來,所以沒有人會對它造成任何傷害,除非中央存儲庫也受到損害,並且更重要的是,即使存在潛在危害,也僅限於欺騙它以拖動不良版本,但沒有數據可以被刪除,因此不能訪問計算機的其他部分。

一個SSH觸發器是一個腳本,即與SSH(前綴.ssh/authorized_keyscommand=觸發公鑰)特定公鑰相關聯。當您使用該密鑰登錄ssh時,ssh將忽略客戶端提供的命令並運行觸發器。這可以在有人竊取密鑰時限制可能的損害,因爲觸發器可以使用自己的邏輯知道該做什麼,並且不接受來自客戶端的任何輸入。

或者,您可以簡單地推送並安裝適當的掛鉤來檢出。請參閱this question

2

您可以在Git中設置鉤子以輕鬆獲得您想要的東西。利用-收到後掛機,接收從標準輸入以下內容:

<oldrev> <newrev> <refname>

例子:

aa453216d1b3e49e7f6f98441fa56946ddcd6a20 68f7abf4e6f922807889f52bc043ecd31b79f814 refs/heads/master

使用refname,你可以在你的腳本什麼的分支被推看並推動到適當的回購 - www或dev。

或者,你可以使用post-update鉤接收 refname,也可以作爲一個參數做同樣的事情。

爲了完整起見,掛鉤必須放置在中央倉庫的掛鉤中。