基本步骤
- 安装 GIT
- 创建系统 GIT 的组和用户
- 创建 GIT 仓库与设置同步
- clone 服务器仓库至服务器目录
- 克隆服务器的 GIT 仓库到本地
- 同步本地代码自服务器
环境及说明
- CentOS 7 64x
一、 安装GIT
1.1 安装 Git 依赖
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel perl-devel
1.2 安装 Git
yum install -y git
安装完成后,可通过 git --version
验证 git 安装是否成功
git --version
git version 1.8.3.1
二、创建系统 GIT 的组和用户
为 Git 创建单独的系统用户组和用户,提高系统的安全性。
2.1 创建系统 Git 用户组
# user-gourp 替换为您想创建的用户组,一般 git 即可
groupadd user-group
2.2 创建系统 Git 组下的 Git 链接用户
# username 替换为您的 Git 用户名
# user-gourp 替换为您创建 Git 用户组
adduser username -g user-gourp
2.3 给 Git 用户设置密码
# username 替换为您的 Git 用户名
passwd username
Changing password for user username.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.
如果是正式服务器,为避免被攻击,密码强度请设置的强一点
三、创建 GIT 仓库与设置同步
3.1 创建 GIT 仓库
仓库可以创建在任意位置,如果系统盘紧张,可以创建在挂接盘或其他目录
本文以创建在 home 目录下为例
# 切换至 home 目录
cd /home
# 创建 git_repository 目录
mkdir git_repository
# 切换至 git_repository 目录
cd git_repository
# 创建一个裸的 git 仓库 --bare 是代表创建裸仓库,这个参数一定记得带上
git init --bare demo.git
# 把 demo.git 目录赋权给您创建的 Git 用户
# username 替换为您创建 Git 用户名
# user-gourp 替换为您创建 Git 用户组
chown -R username:user-group demo.git
# 文件只有文件所有者或同在一个用户组下的用户可读,可写,可执行,其他用户只有读权限
chmod 774 -R demo.git
3.2 设置 GIT 目录同步
原理是创建收到提交请求时执行的脚本,这样当你在本地仓库执行git push后就会触发 post-receive 这个脚本。
3.2.1 创建 post-receive 脚本文件
# your-git-repository-path 替换为您 git_repository 路径
cd /your-git-repository-path/demo.git
# 切换目录至 hooks
cd hooks
# 创建 post-receive
vi post-receive
3.2.2 修改 post-receive 脚本文件
#!/bin/sh
unset GIT_DIR
# 您项目的工作目录
ProjectPath="/var/www/demo"
# 定义日志目录
LogPath="/your-git-repository-path/project.git/hooks"
# 输出日期到日志
echo -e "\n================= `date +"%Y-%m-%d %H:%M:%S"` ===============\n" >> $LogPath/auto-sync.log 2>&1
# 自动同步方法
# 1. 直接拉取并合并
git pull origin master >> $LogPath/auto-sync.log 2>&1
# 2. 拉取最新版本至本地,不自动合并
# git fetch --all
# git reset --hard origin/master
echo "====================================================== " >> $LogPath/auto-sync.log 2>&1
这里有2个问题未解决
-
定义日志目录,如果定义 hooks 外层,则无法写入。赋权整了一整也没弄出来
-
根据 服务器自动部署项目之GitHooks神器 所说,用 git fetch 而非 git pull 实现。 区别在于:
- git fetch:相当于是从远程获取最新版本到本地,不会自动merge。
- git pull:相当于是从远程获取最新版本并merge到本地。
- pull实现相当于fetch后再用merge,来合并本地和远端的代码。
这里就有个问题,如果开发者在提交过程出现失误,使用git reset复位后,现在远端的代码版本低于web端的代码版本,再使用pull的时候就不能实现和开发者本地的代码的同步。所以这里使用fetch后,在强制使用reset实现web端的代码版本指针和git服务端的一致。(如果在本机可以使用stash,然后pull,然后drop刚才stash的内容)
他这段话意思是明白了,但是没明白具体操作,望高手指点。
3.2.3 post-receive 脚本文件赋权
# username 替换为您创建 Git 用户名
# user-gourp 替换为您创建 Git 用户组
chown username:user-group post-receive
chmod -R 774 post-receive
四、clone 服务器仓库至服务器目录
本文自动代码同步的语言为 php,其他语言类同,请自己切换服务器目录
# 切换至 apache 项目目录
cd /var/www
# your-git-repository-path 替换为您 git_repository 路径
# project-name 切换为clone 后您需要的项目名称
git clone /your-git-repository-path/demo.git project-name
# 赋权
# username 替换为您创建 Git 用户名
# user-gourp 替换为您创建 Git 用户组
# project-name 替换为clone 后的项目名称
# 赋权775 其他用户可读可执行,否则项目可能启动不了
chown -R username:user-group project-name
chmod -R 775 project-name
五、克隆服务器的 GIT 仓库到本地
各操作系统工具不一致,可以用工具,命令行同步到本地.
链接地址:
# username 替换为您创建 Git 用户名
# your-git-repository-path 替换为您 git_repository 路径
# server 可以是 IP,也可以是域名
# port 当您修改了端口时需要,未设置为空即可
ssh://username@server:port/your-git-repository-paht/demo.git
示例:
ssh://test@192.168.0.111/home/git_respository/demo.git
六、同步本地代码自服务器
可用工具,也可命令提交代码自服务器,这里就不多说了
错误日志可查看 auto-sync.log
# your-git-repository-path 替换为您 git_repository 路径
cat /your-git-repository-paht/demo.git/hooks/auto-sync.log
广告栏: 欢迎关注我的 个人博客