本地开发,远程部署:如何把你的服务器变成Git仓库?
⏯️从何而来
上一篇博客中讲到,我在我自己的服务器上部署了一个Blogroll项目。在写作博客的时候我突然想到,hexo框架的博客可以在本地机上写,然后用hexo d命令一键部署,那么这个项目也应该可以这样操作。
⏩实践过程
由于之前部署hexo博客的时候已经建过git用户了,这次就不用再建用户了.首先以git用户的身份打开bash,然后直接在/home/git底下建立一个新的bare仓库:
1 | git init --bare link-house.git |
下一步就是设置一个post-receive脚本,正像名字所暗示的那样,这个脚本会在服务器每次接收到一次推送之后,都会执行这个脚本。脚本语言采用bash,一个很简单的例子如下:
1 | git --work-tree=/data/hexo --git-dir=/home/git/hexo.git checkout -f |
这是之前为hexo博客仓库写的自动部署脚本,会在服务器接收到push之后,将这些修改checkout到work-tree(即/data/hexo)中。创建脚本之后,还要给脚本赋予可执行权限chmod u+x ./hooks/post-receive。
但是这个脚本有一个缺点:没办法知道它究竟执行了没有,结果如何。本来我为friend-link-house这个项目也是配置的类似的脚本,但是从本地机push之后,服务器端并没有更新。ssh到服务器上手动执行这个post-receive脚本才发现是work-tree文件夹的权限没有设置对。如果这个脚本执行的时候有log记录执行结果,那岂不是更好?于是我让deepseek帮我写了一个脚本:
1 |
|
这样就可以随时查看log文件,以获取上一次部署的相关信息。
❓出现了一些问题
在这样调试好之后,我非常兴奋地从本地机push到了git@<服务器域名>:/home/git/link-house.git上。然而,网页上并没有发生这个更新。这又是为什么呢?反复研究了这个过程之后,我终于发现……
原来我的post-receive光顾着git checkout把文件复制进去了,而npm run build所构建的dist文件夹又在.gitignore列出的忽略文件里,所以服务器端的dist文件夹其实并没有被修改。解决起来也很简单,就在post-receive脚本里添加构建命令就可以了,修改如下:
1 | 43,46d42 |


