git 是一个开源的分布式版本控制系统,用以有效、高速的处理从很小到非常大的项目版本管理。git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
本节记录如何搭建一个 Git服务器,以供保存、共享或部署代码。
在 CentOS 上可以使用 yum 命令进行安装:
yum install -y git
也可以下载源码包进行编译安装,具体参考: Git 介绍、理解及使用指南(一) 安装一节。
adduser git
cd /home/git // 切换到希望创建工作区的目录
git init --bare sample.git // 创建一个 git 仓库,此时 git 会创建一个唯一分支 master
chown -R git:git sample.git // 将 sample.git 的所有权从 root 修改到新创建的 git
Tips:推荐使用密钥登录远程服务器,使用传统的密码登录可能存在被爆破的风险。
在文件 /etc/ssh/sshd_config
中添加下列三行内容:
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
创建用于存放客户端公钥的文件:
cd /home/git //切换到刚刚创建的 git 用户目录下
mkdir .ssh
touch .ssh/authorized_keys //创建用于存放客户端公钥的文件
ssh-keygen -t rsa -C "user@email.com"
该命令会在用户主目录的 .ssh
文件夹下生成两个文件:
用于保存私钥的 id_rsa
用于保存公钥的 id_rsa.pub
将生成的 id_rsa.pub
中的内容拷贝到服务器文件 /home/git/.ssh/authorized_keys
。
git clone git@domain:/home/git/sample.git
git remote add origin git@domain:/home/git/sample.git
其中 domain 可以是服务器端的域名或 IP 地址。
修改文件 /etc/passwd
。
将最后一行
git:x:1000:1000::/home/git:/bin/bash
修改为
git:x:1000:1000::/home/git:/usr/bin/git-shell
最后,在进行一个提交操作后,push 就可以把代码推送到远程 master 分支了。
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 进行提交。