Centos7 安装部署Git服务、创建仓库

概述

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"
  1. 创建 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
  1. 配置 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)的解决方法在之前的博客中都做了充分的文档和说明,还是要多实践,实践才是检验真理的唯一标准。

相关推荐
我崽不熬夜4 分钟前
你真的掌握了Java多线程编程吗?并发的这些秘密你可能还不知道!
java·后端·java ee
麻衣带我去上学9 分钟前
Spring依赖注入源码学习:基于注解的DI源码解析
java·后端·spring
mldong14 分钟前
mldong 快速开发框架字典模块设计与实现
java·后端·架构
丘山子42 分钟前
了解 Go Channel
后端·面试·go
我崽不熬夜1 小时前
如何让你的Java代码更加优雅且高效?你也许忽视了这些细节!
java·后端·java ee
Pitayafruit1 小时前
后端开发必看:零代码实现存量服务改造成MCP服务
java·后端·mcp
程序员岳焱1 小时前
2025年Java全栈开发新趋势深度解析:从技术融合到工程实践
java·人工智能·后端
Victor3561 小时前
MySQL(91)什么是分布式数据库?
后端
mCell1 小时前
密码校验与攻击面:不再“裸奔”的防线
后端·安全·go
满分观察网友z1 小时前
UI的排序魔法:中序遍历如何拯救我混乱的筛选器(94. 二叉树的中序遍历)
后端·算法