是否有可能从git服务器推送到客户端?

时间:2014-06-11 11:18:58

标签: git continuous-integration

当我将更改推送到Git服务器时,我希望它将整个存储库推送到其他计算机。

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

我使用hooks在有人办理登机手续时收到通知但有效,但我不知道如何从服务器推送到其他机器。我读了Git Workflow(只是基本的工作流程),但没有什么可以帮助我。

有可能这样做吗?我应该使用什么命令或关键字进行谷歌搜索?

1 个答案:

答案 0 :(得分:2)

首先,这不是使用git或将应用程序部署到服务器的常用方法。对于部署,有一些特殊工具,例如capistrano用于ruby on rails或capifony扩展名为symfony。当然还有更多用于其他目的。


然而,你问的问题也可以通过git完成,即使它是hackish。

首先,您需要在Machine AMachine B上复制回购,并且您需要从git server ssh访问这些计算机。

git server上添加这些遥控器:

git remote add MachineA user@MachineA:/path/to/repository.git
git remote add MachineB user@MachineB:/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应尽可能地受到限制。