2010-09-16 144 views
40

我们有一个网站,其所有的PHP/HTML/JS/CSS/etc文件存储在一个Git仓库。Git推送到服务器

我们目前有3种类型的计算机(或用例)用于存储库。

  • 当地开发商:拉最新变化,修改,提交到本地回购,推到主服务器
  • 主服务器:中央存储库,所有的改变推送到主服务器
  • Web服务器:变化部署网站

时,所以目前的主服务器上拉低我们:

local: git push origin master 
local: password: ******** 
local: ssh [email protected] 
webserver: password: ******** 
webserver: cd ~/domain.com/ 
webserver: git pull origin master 

所以我的问题是:有没有一种方法可以从我的本地计算机上直接推送到Web服务器?

即。

local: git push origin master 
local: password: ******** 
local: git push webserver master 
local: password: ******** 
+0

的[使用Git推部署项目可能重复](http://stackoverflow.com/questions/279169/deploy-a-project-using-git-push)。远程机器上的一个很好的可能性是[git config receive.denyCurrentBranch updateInstead](http://stackoverflow.com/a/28381235/895245)。 – 2015-02-07 11:14:50

回答

10

看git的URL的http://www.kernel.org/pub/software/scm/git/docs/v1.6.0.6/git-push.html

部分,所以你会尝试:

git push ssh://[email protected]/~admin/domain.com/ master 

新增: 我想你问的部分是如何有多个远程仓库。

git remote add webserver ssh://[email protected]/~admin/domain.com/ 

,允许你运行:

git push origin master 
    git push webserver master 
+1

问题是推拉不可互换。推入回购将不会修改工作分支。 – cmcginty 2010-09-16 19:41:56

+0

@Casey,如果你读到这个问题,他只是问如何推动,他没有提到试图更新工作树。对于他打算做的事情你可能是对的,但对于面对他的问题,他的投票似乎有些苛刻。 – 2010-09-16 20:23:32

+0

在他的问题中,他目前的工作流程是“git pull origin master” – cmcginty 2010-09-16 20:45:28

33

是的,你可以直接推到你的网络服务器,但我不会推荐它,因为你只能推到与--bare参数克隆库。我会利用git hook系统让主存储库自动更新Web服务器上的repo。退房更新后钩:

http://git-scm.com/docs/githooks

此脚本可以依次登录到通过ssh网络服务器,并做

cd ~/domain.com/ 
git checkout master 
git pull origin master 

这样,你只需要专注于推动到中央服务器并且不必关心网络服务器,一旦推送完成,它将一直更新。如果你可以自动化一些东西,然后自动化:)

我甚至找到了一篇关于通过ssh登录脚本的好文章(如果你必须使用密码,如果已经设置了ssh-key,这是微不足道的) :

http://bash.cyberciti.biz/security/expect-ssh-login-script/

希望这有助于!

28

我有相同的查询,并不满意当前最受赞赏的答案在这里结束了以下git-website-howto其中概述了过程相当好,是一个更清洁和更快的方法。

TL; DR,git init --bare在您的Web服务器上创建一个新的回购站,您将从开发机器推送您的更改。当网络回购站收到您的更改时,它会触发接收后挂接,然后将这些文件复制到您的网站根目录。

我喜欢这种方式,因为post-receive hook可以在你的服务器上完成这项工作,所以你的本地机器可以更快速地完成自己的工作。这也使得为特定分支设置远程跟踪变得非常容易。因此,您可以让一个名为production的分支更新您的Web服务器,而您的主控继续进行开发并连接到其他地方的git仓库。

注意:您需要在您的web服务器repo上运行git config receive.denycurrentbranch ignore以在推送时禁止本地开发箱上的警告。

+0

该howto工作伟大的我。因为我在服务器的一个目录中工作,而另一个需要在'post-receive'文件中sudo用户。 'sudo -u -H sh -c“GIT_WORK_TREE =/path/to/live git checkout -f”' – 2017-06-13 14:24:17

0

在部署本地更改之前,请检查目标服务器上是否有任何更改。

添加到部署脚本,以确保一切都没有改变对服务器:如果有改动的文件,比分析git的状态更容易

$ git ls-files -dmo --exclude-standard 

将是空