概述
Git版本控制,大家都不会陌生,实践诉求是从零部署本地Git服务,在执行推送远程分支代码时,用Git服务自带的hooks触发同步代码文件,从而做到自动同步代码,实现自动更新,操作环境centos7.9
,Git版本1.8.3
进行的实践。
实现原理和过程
在服务器上部署安装Git服务,创建Git管理组和用户,进行项目初始化的目录就是远程的服务端,主要是用于项目的配置,另外再新建项目的工作区,所属组和所属用户 都属于Git,在钩子中监听Git操作,在push时用rsync同步到Git分支所对应的工作区,在删除Git分支时进行保护。

以下是几个重要概念和实现原理的流程图:
服务端 服务器ip 172.16.163.141
:
- Git 远程服务区:这个目录是服务端初始化的目录,仅用于配置服务,没有具体的代码文件
- 钩子:位置在服务区 hooks 文件夹下面,用于git操作时触发对应操作
- Git 工作区:具体的Git文件代码存放位置,用于Nginx配置server的目录位置
开发机:
- 本地仓库:需要把Git分支的代码克隆到本机,用于开发,完成后推送至Git 远程服务区进行管理。
安装与卸载
1、安装 EPEL 存储库 , yum 安装 Git,查看Git版本和配置管理员信息
bash
# 安装 EPEL 存储库
sudo yum install epel-release -y
sudo yum install git -y
git --version
git config --global user.name "你的用户名"
git config --global user.email "你的邮箱@example.com"
- 创建 Git 用户与裸仓库
建议创建一个Git组和Git用户,来配置SSL验证,创建仓库并初始化仓库,/data/git/repos/klsg.git
这个目录作为整个远程分支的根节点。
bash
# 创建专用 git 用户
sudo adduser git
sudo passwd git # 设置密码
# 创建项目目录
sudo mkdir -p /data/git/repos/klsg.git
sudo chown -R git:git /data/git
# 切换到 git 用户
su - git
# 初始化裸仓库
cd /data/git/repos/klsg.git
git --bare init
- 配置 SSH 密钥认证,将团队成员的公钥添加到
authorized_keys
可以配置多个成员。
bash
# 创建 .ssh 目录
mkdir ~/.ssh
chmod 700 ~/.ssh
touch ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
未生成公钥:执行命令进行生成: ssh-keygen -t rsa -b 4096 -C "[email protected]"
这里需要注意的地方,裸仓库默认是没有版本的,不要在这个目录操作,会产生错误信息fatal: This operation must be run in a work tree
,去创建一个空目录,加入版本库。
4.创建版本库和工作区,创建目录/home/www/masterklsgapi
作为master分支的工作区
bash
# 初始化版本库
git init
# 设置管理员信息
git config --global user.email "[email protected]"
git config --global user.name "stark"
# 推送远程分支
git remote add origin /data/git/repos/klsg.git
git push --set-upstream origin master
git push
回到/data/git/repos/klsg.git
目录,执行git branch
,master分支已经存在了。
5.在本地仓库,克隆拉去远程分支
bash
git clone [email protected]:/data/git/repos/klsg.git
备注:在添加版本库时,会产生warning
错误信息 LF will be replaced by CRLF the next time Git touches it
,解决办法如下:
bash
# 如果你在Windows上工作
git config --global core.autocrlf true
# 如果你在Linux/MacOS上工作
git config --global core.autocrlf input
# 如果你不希望Git自动转换行尾符
git config --global core.autocrlf false
6.推荐步骤,配置触发钩子,钩子很好理解,就是Git服务里自动触发的监听shell脚本,现在要实现的步骤是当我推送到远程分支时,自动触发同步代码到步骤4的工作区目录中。
bash
#!/bin/bash
# 获取当前操作分支名称
read oldrev newrev refname
current_branch=$(echo $refname | cut -d/ -f3-)
SERVER_DIR="/data/git/repos/klsg.git"
# 定义分支与工作区的映射关系
declare -A branch_workspace_map=(
["master"]="/home/www/masterklsgapi"
["pre"]="/home/www/preklsgapi"
["dev"]="/home/www/devklsgapi"
)
# 查找目标工作区路径
target_workspace=${branch_workspace_map[$current_branch]}
# 检查是否找到对应工作区
if [ -z "$target_workspace" ]; then
echo "⚠️ No workspace mapped for branch '$current_branch'. Skipping deployment."
exit 0
fi
# 验证目标工作区是否存在
if [ ! -d "$target_workspace" ]; then
echo "❌ Error: Target workspace '$target_workspace' does not exist!"
exit 1
fi
# 复制文件到工作区(排除.git目录)
echo "🚀 Deploying branch '$current_branch' to $target_workspace"
# 1. 创建临时目录
mkdir -p /tmp/git-export
# 2. 在源仓库目录中,将目标分支的内容导出到临时目录
cd SERVER_DIR
git archive "$current_branch" | tar -x -C /tmp/git-export
# 3. 使用 rsync 同步临时目录到工作区
rsync -avz --exclude='.git' /tmp/git-export/ "$target_workspace"
# 4. 清理临时目录
rm -rf /tmp/git-export
#rsync -a --delete --exclude='.git/' --exclude='.gitignore' ./ "$target_workspace/"
echo "$target_workspace"
echo "$current_branch"
# 检查同步结果
if [ $? -eq 0 ]; then
echo "✅ Successfully deployed to $target_workspace"
else
echo "❌ Deployment failed! rsync error code: $?"
exit 1
fi
exit 0
总结与思考
Git服务的安装和部署就写到这里,分支之间的 导出(archive)、忽略(gitignore)、隐藏(Stash)、合并冲突(merge)的解决方法在之前的博客中都做了充分的文档和说明,还是要多实践,实践才是检验真理的唯一标准。