Git:推送到远程存储库时更新网站?

Git:推送到远程存储库时更新网站?,git,workflow,Git,Workflow,我有一个网站,每当我推到远程存储库时,我都想更新它。我来自svn背景,仍在努力理解git 现在,我已经做了以下工作: 在包含网站的本地计算机上设置Git存储库 已将(裸)存储库克隆到我的web服务器 现在我有点困了。我可以将更改推送到服务器上的裸存储库,但我不知道如何签出www目录中存储库的工作副本,并在将本地存储库推送到服务器时自动更新它。我可能需要一个钩子脚本,对吗 相关问题,部分回答了我的问题,但我想知道脚本实际上在做什么 这对我有用,也许对你有用: 我在网上找到了一个非常好(优雅)的

我有一个网站,每当我推到远程存储库时,我都想更新它。我来自svn背景,仍在努力理解git

现在,我已经做了以下工作:

  • 在包含网站的本地计算机上设置Git存储库
  • 已将(裸)存储库克隆到我的web服务器
现在我有点困了。我可以将更改推送到服务器上的裸存储库,但我不知道如何签出www目录中存储库的工作副本,并在将本地存储库推送到服务器时自动更新它。我可能需要一个钩子脚本,对吗


相关问题,部分回答了我的问题,但我想知道脚本实际上在做什么

这对我有用,也许对你有用:

我在网上找到了一个非常好(优雅)的解决方案

它基本上从一个裸存储库开始,并将工作树更改为web服务器文件夹。之后,它使用post-receive钩子在每次接收推之后更新工作树。一个优雅且易于遵循的程序

除了那篇文章中的设置之外,我还添加了一个软链接的“.git”目录,从网站位置返回到git存储库位置:

ln -s /home/caius/git/somesite.git/ /home/caius/vhosts/somesite.com/htdocs/.git
通过这种方式,我可以登录到web服务器上并使用网站文件夹中的“git checkout”签出另一个分支

我还使用了对Python脚本“ygit push all.py”的轻微修改来更新我的多台机器,这些机器都使用不同的配置文件运行相同的框架代码。您甚至可以为每台服务器设置一个分支(如演示/开发)

此外,我在全局git配置文件中添加了以下别名:

[alias]
    push-all = !ygit-push-all.py
    check-all = !sh -c 'git branch -r -v | grep master | awk \"{ print \\$1, \\$2 }\"'
git push all将更新我的所有远程位置


git check all将向我显示每个远程主分支的版本

为什么不在服务器上保留一个普通的存储库而不是一个空的存储库?然后直接推送/服务?@Adam:我最初尝试过,但当我尝试推送(git push web server)时,我得到了以下错误:remote:error:默认情况下,在非裸存储库中更新当前分支被拒绝,因为它会使索引和工作树不一致+1,这是一个很好的解决方案,但我必须提到,它要求您在主机上存储两次信息,因为它涉及两个存储库。我知道这是一种折衷,只是说:)这个解决方案的好处是,你可以拥有一个现有的公共目录(比如wordpress核心文件),而裸repo只能有一个子集(比如/wp-content/themes/mytheme)
git-checkout-f
将管理/合并跟踪文件的子集(非常类似于wpengine使用的解决方案)。