2014-06-11 52 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应尽可能受限制。

相关问题