1. 介绍

git 是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。

本节记录如何搭建一个 Git服务器,以供保存、共享或部署代码。

2. 搭建 Git 服务器

2.1 安装 git

在 CentOS 上可以使用 yum 命令进行安装:

yum install -y git

也可以下载源码包进行编译安装,具体参考: Git 介绍、理解及使用指南(一) 安装一节。

2.2 创建一个新的 Linux 用户

adduser git

2.3 创建 git 仓库

cd /home/git // 切换到希望创建工作区的目录
git init --bare sample.git // 创建一个 git 仓库,此时 git 会创建一个唯一分支 master
chown -R git:git sample.git // 将 sample.git 的所有权从 root 修改到新创建的 git

2.4 打开服务器的 RSA 认证

Tips:推荐使用密钥登录远程服务器,使用传统的密码登录可能存在被爆破的风险。

在文件 /etc/ssh/sshd_config 中添加下列三行内容:

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys

创建用于存放客户端公钥的文件:

cd /home/git //切换到刚刚创建的 git 用户目录下
mkdir .ssh
touch .ssh/authorized_keys //创建用于存放客户端公钥的文件

2.5 在客户端创建 SSH key

ssh-keygen -t rsa -C "user@email.com"

该命令会在用户主目录的 .ssh 文件夹下生成两个文件:

  • 用于保存私钥的 id_rsa
  • 用于保存公钥的 id_rsa.pub

2.6 把生成的公钥导入到服务器中

将生成的 id_rsa.pub 中的内容拷贝到服务器文件 /home/git/.ssh/authorized_keys

2.7 在客户端克隆远程仓库

2.7.1 直接克隆分支

git clone git@domain:/home/git/sample.git

2.7.2 添加远程分支

git remote add origin git@domain:/home/git/sample.git

其中 domain 可以是服务器端的域名或 IP 地址。

2.8 禁止用户 git 通过 shell 登录服务器

修改文件 /etc/passwd

将最后一行

git:x:1000:1000::/home/git:/bin/bash

修改为

git:x:1000:1000::/home/git:/usr/bin/git-shell

最后,在进行一个提交操作后,push 就可以把代码推送到远程 master 分支了。

3. 自动化部署

git 支持 hook,即常说的钩子事件,我们可以利用它方便的在提交、推送更新后执行一些操作,比如将分支检出到指定目录,来实现自动化部署。

将 hooks 目录下的对应 post-update.sample 文件重命名为 post-update 即可激活,我们注释掉最后一行的 exec,然后加入检出命令:

# exec git update-server-info
git --work-tree=/home/wwwroot/domain.com --git-dir=/home/git/sample.git checkout -f

当我们每次推送更新到服务器时,该命令就会自动将主分支(默认为 master)检出到 domain.com 目录下。

脚本中还可以加入一些其他操作,比如动态修改配置文件,执行 composer、npm 安装依赖库等等。

例如动态修改配置文件:

cd /home/wwwroot/domain.com/application/extra
sed -i "s#http://local.test#https://domain.com#g" sample.php
cd /home/wwwroot/domain.com/application/extra/paypal-config
sed -i "s#LIVE#SANDBOX#g" sdk_config.ini

如果检出的分支代码出现问题,这时就需要退回到原来的版本,怎么做呢?可以将本地分支 reset 重置到历史版本,然后强制 push 到服务器上。

git reset --hard hash
git push -f <remote> master

此时使用 git log 查看本地提交记录只会显示到 hash 为止,之后的记录都丢失了。我们可以使用

git reflog

查看所有提交记录。
然后本地分支 reset 回到任意历史版本即可。

git reset --hard hash
git push -f <remote> master

本地修改无误后再次进行 push 进行提交。