CentOS 7 搭建 Git 实现代码自动同步/自动部署

基本步骤

  1. 安装 GIT
  2. 创建系统 GIT 的组和用户
  3. 创建 GIT 仓库与设置同步
  4. clone 服务器仓库至服务器目录
  5. 克隆服务器的 GIT 仓库到本地
  6. 同步本地代码自服务器

环境及说明

  1. 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个问题未解决

  1. 定义日志目录,如果定义 hooks 外层,则无法写入。赋权整了一整也没弄出来

  2. 根据 服务器自动部署项目之GitHooks神器 所说,用 git fetch 而非 git pull 实现。 区别在于:

    1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge。
    2. git pull:相当于是从远程获取最新版本并merge到本地。
    3. pull实现相当于fetch后再用merge,来合并本地和远端的代码。

    这里就有个问题,如果开发者在提交过程出现失误,使用git reset复位后,现在远端的代码版本低于web端的代码版本,再使用pull的时候就不能实现和开发者本地的代码的同步。所以这里使用fetch后,在强制使用reset实现web端的代码版本指针和git服务端的一致。(如果在本机可以使用stash,然后pull,然后drop刚才stash的内容)

    他这段话意思是明白了,但是没明白具体操作,望高手指点。

    扫描二维码关注公众号,回复: 126370 查看本文章

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://[email protected]/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

广告栏: 欢迎关注我的 个人博客

猜你喜欢

转载自my.oschina.net/u/3767256/blog/1789415