如何在您的Web主机上进行“ git push”更新文件?


13

我有一些网站都在共享托管下托管在同一网络托管服务上。我的网络主机支持Git,并且可以通过SSH进行访问,并且我的笔记本电脑上也具有Git设置。

我想这样做,以便当我执行“ git push origin master”时,它将自动更新Web服务器上的文件,并且还保存以前提交的文件的备份,以便我可以轻松回滚。这可能吗?


很好奇-谁是您的托管服务提供商?
用户

以及为什么要“备份先前提交的文件”?如果您想回滚,则可以只推送上一个提交(假设您始终知道上次提交的内容,但是无论如何您都应该知道)。
sleske

Answers:


12

使用Git管理网站》中对此进行了总结。

该过程的关键是服务器端钩子“ post-receive”(有关Customizing Git的 git hooks -Git Hooksgithooks手册页的更多信息)。服务器接收到所有数据后,此挂钩将运行。

服务器接收到数据后,它将运行git checkout -f -f选项将强制检出到磁头,即使存在局部差异也是如此。

#!/bin/sh
GIT_WORK_TREE=/var/www/www.example.org git checkout -f

将其放在hooks/目录中post-receive并作为可执行文件。当然,路径会更改为您拥有Web服务器文件的位置(使用GIT_WORK_TREE设置环境变量的方式,因此您无需在服务器上处理点文件和git设置)。

为了回滚,应该为每个发行版加上标签(这也可以作为提交后挂钩的一部分来完成)。通过标记发布,可以轻松地确定要回滚的位置,尽管这可能涉及登录服务器并签出该标签。


应该注意的是,这意味着您正在使用git作为部署工具,这并不是真正的目的。它可以工作,但是有很多限制(需要下载整个仓库,没有办法调用脚本或管理文件权限,没有办法解包……)。使用适当的部署工具可能更好。
sleske

@sleske您可以在post-receive挂钩中完成所有操作,实际上这只是一个脚本,您可以在其中放入所需的任何内容。
马里奥(Mario)

@Mario:是的,您可以-意味着您正在有效地实现自己的部署解决方案,作为接收后挂钩。使用现有解决方案仍然有很多好处,但是有时最好自己动手...
sleske 2015年

您甚至可以签出到中间文件夹,并具有从Web文件夹到中间文件夹的链接,以避免在Web文件夹中包含.git文件。
弯曲

0

更新要推送到的存储库的工作树的最简单方法是 git config receive.denyCurrentBranch updateInstead 在接收方设置 。参见 https://git-scm.com/docs/git-config/#git-config-receivedenyCurrentBranch

Ryan对post commit hooks的回答比较好,因为它允许签出到其他不同的位置(您可能不想在Web文件夹中使用.git)。但是在此级别上,最好使用一些现有的部署工具,例如sleske在评论中说的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.