55

我们有一个网站,其所有 PHP/HTML/JS/CSS/etc 文件都存储在 Git 存储库中。

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

  • 本地开发人员:拉取最新更改,进行更改,提交到本地仓库,推送到主服务器
  • 主服务器:中央存储库,所有更改都被推送到主服务器
  • Web 服务器:部署网站时从主服务器拉下更改

所以目前我们:

local: git push origin master
local: password: ********
local: ssh admin@webserver.com
webserver: password: ********
webserver: cd ~/domain.com/
webserver: git pull origin master

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

IE。

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

6 回答 6

39

是的,您可以直接推送到您的网络服务器,但我不推荐它,因为您应该只推送到使用 --bare 参数克隆的存储库。我会利用 git hook 系统让主存储库自动更新 Web 服务器上的存储库。查看更新后挂钩:

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

该脚本可以依次通过 ssh 登录到 Web 服务器并执行

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

这样您只需要专注于推送到中央服务器,而不必关心 Web 服务器,一旦推送完成,它将始终更新。如果你可以自动化某些东西,那么就让它自动化:)

我什至为您找到了一篇关于在脚本中通过 ssh 登录的好文章(如果您必须使用密码,如果设置了 ssh-key,这很简单):

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

希望这可以帮助!

于 2011-04-27T19:16:55.983 回答
34

我有相同的查询,但对此处当前投票最多的答案不满意,最终遵循了git-website-howto,它很好地概述了该过程,并且 IMO 是一种更清洁、更快捷的方法。

TL;DR,git init --bare在您的 Web 服务器上创建一个新的存储库,您将从您的开发机器推送您的更改。当 Web 存储库收到您的更改时,它会触发 post-receive 挂钩,然后将文件复制到您的 Web 根目录。

我喜欢这种方法,因为 post-receive 挂钩在您的服务器上完成工作,因此您的本地机器可以更快地推送并释放自己。这也使得为特定分支设置远程跟踪变得非常容易。因此,您可以调用一个分支production来更新您的 Web 服务器,而您的 master 继续用于开发并链接到其他地方的 git 存储库。

注意:你需要git config receive.denycurrentbranch ignore在你的 web 服务器 repo 上运行,以在推送时抑制本地开发框上的警告。

于 2012-09-20T16:43:54.680 回答
10

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

所以你会尝试:

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

补充:我认为您所要求的部分内容是如何拥有多个远程存储库。

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

允许您运行:

   git push origin master
   git push webserver master
于 2010-09-16T18:21:32.233 回答
4

我认为您正在寻找的功能在这里描述:http ://debuggable.com/posts/git-tip-auto-update-working-tree-via-post-receive-hook:49551efe-6414-4e86-aec6- 544f4834cda3

local您可以将网络服务器添加为远程服务器,就像您做其他任何事情一样:

git remote add webserver admin@webserver:/path/to/repo.git/
# push only master branch by default
git config remote.webserver.push master  

现在,当您准备好推动时,您可以这样做:

git push webserver
于 2010-09-16T19:47:11.170 回答
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 - # shorthand for previous branch, git checkout @{-1} $ git branch -d temp

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

于 2018-06-29T19:08:18.070 回答
0

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

添加到部署脚本以确保服务器上没有任何更改:

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

如果有未更改的文件则为空,比解析 git status 更容易

于 2017-02-20T15:26:59.577 回答