在测试和运行脚本语言(如 php、python、javascript)的应用或网站时,传统的方式是使用 FTP 或 SFTP 来部署到生产环境。它们是简单直观的部署方式,但略显繁琐。如果部署的新版本有问题,想要回退也是一件麻烦事。

那么,能不能利用 Git 来管理生产环境中的服务器(以 Linux 为例)呢?使用 Git 来自动部署服务器上的文件,简化工作流。同时利用 Git 的版本管理功能进行快速的版本切换,便于测试和回退。

答案是可以的。配置完成后,仅需一条"git push production"命令即可完成更新,大大提升部署的效率。

实现原理和前提条件

该方法利用了三个仓库,分别为用户的本地仓库、服务器上裸仓库、服务器上的生产环境服务器仓库。用户在本地仓库更新完代码后,push 到服务器上的一个裸仓库,触发该仓库中的一个自动化脚本,让生产环境的服务器仓库从裸仓库 pull 新的版本,以更新生产环境中的服务器代码。

可见,实现以上功能,需先满足:

  1. 目标 Linux 服务器可以通过基于密钥的 SSH 访问
  2. 服务器和本地均已经安装 Git
  3. 你的生产环境服务器文件是一个 Git 仓库

创建一个裸仓库以推送

在服务器上,你需要一个裸仓库(bare repository)作为 push 的目标。

裸仓库可以作为一个集中的存储库,包含了项目所有的版本历史记录、分支、标签等元数据信息。它不包含工作区,只用于代码共享和备份。裸仓库还可以通过 Git 协议、SSH 协议等多种协议进行远程访问和传输。

在一个新目录中创建仓库并使用以下命令进行初始化,我们暂且将其命名为"你的项目.git":

mkdir ~/你的项目.git
cd ~/你的项目.git
git --bare init

在 "post-receive" 钩子中添加自动化

在裸仓库的 hooks 目录中,创建一个带有执行权限的脚本,该脚本的作用是将内容从裸仓库拉取到生产环境:

vim ~/你的项目.git/hooks/post-receive

写入如下内容:

#!/bin/bash
unset GIT_DIR
cd 你的服务器文件所在的路径
git pull

将该文件设置为可执行:

chmod +x ~/你的项目.git/hooks/post-receive

配置本地仓库

在本地仓库中添加一个额外的远程仓库:

git remote add production 你的用户名@服务器地址:你的项目.git
git push production

Voilà!