当我将更改推送到Git服务器时,我希望它将整个存储库推送到其他计算机。
[My machine]---- push ---->[git server]---- push ---->[Machine A]
+------- push ---->[Machine B]
我使用hooks
在有人办理登机手续时收到通知但有效,但我不知道如何从服务器推送到其他机器。我读了Git Workflow(只是基本的工作流程),但没有什么可以帮助我。
有可能这样做吗?我应该使用什么命令或关键字进行谷歌搜索?
答案 0 :(得分:2)
首先,这不是使用git或将应用程序部署到服务器的常用方法。对于部署,有一些特殊工具,例如capistrano
用于ruby on rails或capifony
扩展名为symfony。当然还有更多用于其他目的。
然而,你问的问题也可以通过git完成,即使它是hackish。
首先,您需要在Machine A
和Machine 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
应尽可能地受到限制。