将Git推送到生产服务器

57
我们有一个网站,其中所有的PHP/HTML/JS/CSS等文件都存储在Git仓库中。目前我们针对该仓库有三种计算机(或使用情况)类型:
  • 本地开发者: 拉取最新更改,进行更改,提交到本地仓库,推送到主服务器
  • 主服务器:中央仓库,所有更改都会被推送到主服务器上
  • Web服务器:在部署网站时从主服务器拉取更改
所以目前我们:
local: git push origin master
local: password: ********
local: ssh admin@webserver.example
webserver: password: ********
webserver: cd ~/domain.example/
webserver: git pull origin master

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

即。

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

2
可能是使用Git push部署项目的重复问题。一个好的解决方案是在远程上使用git config receive.denyCurrentBranch updateInstead - Ciro Santilli OurBigBook.com
6个回答

41

是的,您可以直接将代码推送到Web服务器,但我不建议这样做,因为你应该只向使用--bare参数克隆的存储库推送。我建议使用Git hook系统,让主存储库自动更新Web服务器上的存储库。请查看post-update钩子:

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

然后,此脚本可以通过SSH登录到Web服务器并执行以下操作:

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

使用这种方式,您只需要专注于向中央服务器推送,而不必关心Web服务器,因为只要推送完成,它就会被更新。如果可以自动化某些事情,则自动化它 :)

我甚至为您找到了一篇有关通过脚本通过SSH登录的不错文章(如果必须使用密码,如果设置了ssh密钥,则此操作很简单):

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


我更喜欢这种方法,而不是在服务器上推送到裸仓库的另一种方法,但是你的脚本代码在这种情况下并没有太多意义 - 那段代码似乎是做事情的“传统”方式,并且似乎与答案中提倡的“自动化”相矛盾。 - Hashim Aziz

36

我有同样的疑问,并不满意当前排名最靠前的答案,最终按照git-website-howto的指示进行操作,这个教程很好地概述了整个过程,我认为这是一个更加简洁和快速的方法。

简而言之,使用git init --bare在您的Web服务器上创建一个全新的存储库,您将从开发机器推送更改到此存储库。当Web存储库接收到更改时,它会触发post-receive hook,然后将文件复制到您的Web根目录。

我喜欢这种方法,因为post-receive hook在您的服务器上执行工作,因此您的本地机器可以更快地推送并释放空间。这也使得为特定分支设置远程跟踪非常容易。因此,您可以拥有一个名为production的分支来更新Web服务器,而主分支仍然用于开发并链接到您在其他地方的git存储库。

注意:您需要在Web服务器存储库上运行git config receive.denycurrentbranch ignore以抑制在推送时在本地开发箱中显示警告。


"Howto对我非常有帮助。因为我需要在服务器的一个目录中与另一个目录交互,所以我需要在post-receive文件中使用sudo用户。 sudo -u <username> -H sh -c“GIT_WORK_TREE=/path/to/live git checkout -f”" - Samuel Cook
1
这样做的好处是不需要在生产Web服务器上存储私钥(以从主要仓库中拉取)。 - cloudsurfin

10

查看http://www.kernel.org/pub/software/scm/git/docs/v1.6.0.6/git-push.html中的Git URL部分。

然后你可以尝试:

git push ssh://admin@webserver.example/~admin/domain.example/ master

补充: 我认为你所要求的部分是如何拥有多个远程仓库。

git remote add webserver ssh://admin@webserver.example/~admin/domain.example/

可以让你运行:

   git push origin master
   git push webserver master

1
问题在于push和pull不能互换使用。向仓库推送不会修改工作分支。 - cmcginty
@Casey,如果你仔细阅读问题,他只是在问如何推送,他并没有提到尝试更新工作树。你可能对他的意图有所了解,但是因为按字面意思回答他的问题而被点踩似乎有些过分了。 - Tim Hoolihan
在这个问题中,他当前的工作流程是“git pull origin master”。 - cmcginty
1
所以我的问题是:我是否可以从我的本地计算机直接推送到Web服务器?本地:git push webserver master。 - Tim Hoolihan

4

1
  1. 添加远程服务器:$ git remote add server ssh://server_hostname:/path/to/git/repo
  2. 在服务器上检出临时分支:$ git checkout -b temp
  3. 推送更改:$ git push server
  4. 检出之前的分支并删除临时分支: $ git checkout - # 简写为上一个分支,git checkout @{-1} $ git branch -d temp

这里有更多背景信息:https://medium.com/@2upmedia/git-push-to-live-server-5100406a26


0
在部署本地更改之前,请检查目标服务器上是否有任何更改。
将以下内容添加到部署脚本中以确保服务器上没有更改:
$ git ls-files -dmo --exclude-standard

如果没有更改的文件,将为空,比解析git状态更容易


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接