首先,这不是使用git或将应用程序部署到服务器的常用方式。对于部署,有专门的工具,如轨道上的红宝石capistrano
或用于symfony的capifony
扩展。当然还有更多用于其他目的。
但是,你问的问题也可以用git来完成,即使它是hackish。
首先,您需要Machine A
和Machine 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
应尽可能受限制。
机器A,机器B等服务器或客户机?如果没有他们的合作,将代码推送给其他开发人员可能是一个非常糟糕的主意根据您设置的方式,您可能会导致冲突(很有可能),甚至会覆盖其他开发人员的更改。 – Chris
Git并不真正遵循“客户端 - 服务器”模型,它更像是“点对点”。就Git而言,您只需在不同的机器上安装存储库。如果你可以通过配置为接受写入存储库的Git传输从“git server”机器连接到“Machine A”,那么你可以“推送”它,但这是一种循环定义。 –