2014-06-11 194 views
1

當我將更改推送到Git服務器時,我希望它將整個存儲庫推送到其他機器。是否可以從git服務器推送到客戶端?

[My machine]---- push ---->[git server]---- push ---->[Machine A] +------- push ---->[Machine B]

我用hooks當有人檢查和得到通知的作品,但我不知道如何從服務器到其他機器推。我讀Git Workflow(只是基本的工作流程),但沒有什麼能幫助我。

可以做到這一點嗎?什麼是我應該用於谷歌的命令或關鍵字?

+0

機器A,機器B等服務器或客戶機?如果沒有他們的合作,將代碼推送給其他開發人員可能是一個非常糟糕的主意根據您設置的方式,您可能會導致衝突(很有可能),甚至會覆蓋其他開發人員的更改。 – Chris

+0

Git並不真正遵循「客戶端 - 服務器」模型,它更像是「點對點」。就Git而言,您只需在不同的機器上安裝存儲庫。如果你可以通過配置爲接受寫入存儲庫的Git傳輸從「git server」機器連接到「Machine A」,那麼你可以「推送」它,但這是一種循環定義。 –

回答

2

首先,這不是使用git或將應用程序部署到服務器的常用方式。對於部署,有專門的工具,如軌道上的紅寶石capistrano或用於symfony的capifony擴展。當然還有更多用於其他目的。


但是,你問的問題也可以用git來完成,即使它是hackish。

首先,您需要Machine AMachine B的回購克隆,並且您需要從git server的ssh訪問該機器。

git server添加這些遙控器:

git remote add MachineA [email protected]:/path/to/repository.git 
git remote add MachineB [email protected]:/path/to/repository.git 

然後你可以把使用這個命令:

git push MachineA master 
git push MachineB master 

而且......轟!你得到一個錯誤:

remote: error: refusing to update checked out branch: refs/heads/master 

這是因爲在這種情況下,遠程倉庫不是裸倉庫。通常情況下,非裸倉庫用於開發。如果有人會推入這樣的回購,它會覆蓋當前的發展狀態,因此git否認這一點(thx git)。在你的情況下,它們並不意味着發展,這樣你就可以發出兩個遠程倉庫下面的命令來擺脫這個問題:

git config receive.denyCurrentBranch ignore 

推將現在的工作,但如果你輸入遠程服務器你會看到那裏的文件沒有改變。這是git的另一種保護,它不會覆蓋本地文件。要達到此目的,您需要在遠程存儲庫上發佈:

git reset --hard HEAD 

。這可以使用post-receive鉤子自動化:

#!/bin/bash 

unset GIT_DIR 
cd .. 
git reset --hard HEAD 

現在它應該按預期工作。 (雖然這不是使用Git的「通常」方式)


爲了避免輸入密碼手動你需要一些密碼認證。但請注意,可以訪問git server的黑客也可以無密碼地訪問這些機器。因此,這些機器上的user應儘可能受限制。

相關問題