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 "stark@126.com"

这里需要注意的地方,裸仓库默认是没有版本的,不要在这个目录操作,会产生错误信息fatal: This operation must be run in a work tree,去创建一个空目录,加入版本库。

4.创建版本库和工作区,创建目录/home/www/masterklsgapi 作为master分支的工作区

bash 复制代码
# 初始化版本库
git init 

# 设置管理员信息

git config --global user.email "stark@126.com"
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 git@172.16.163.141:/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)的解决方法在之前的博客中都做了充分的文档和说明,还是要多实践,实践才是检验真理的唯一标准。

相关推荐
freejackman1 小时前
Java从0到1---基础篇
java·开发语言·后端·idea
无心水1 小时前
20、Spring陷阱:Feign AOP切面为何失效?配置优先级如何“劫持”你的设置?
java·开发语言·后端·python·spring·java.time·java时间处理
0xDevNull2 小时前
Java 21 新特性概览与实战教程
java·开发语言·后端
Gse0a362g2 小时前
Go - Zerolog使用入门
开发语言·后端·golang
Renhao-Wan2 小时前
Docker 核心原理详解:镜像、容器、Namespace、Cgroups 与 UnionFS
java·后端·docker·容器
EFCY1MJ903 小时前
ASP.NET MVC 1.0 (五) ViewEngine 深入解析与应用实例
后端·asp.net·mvc
小江的记录本3 小时前
【RabbitMQ】RabbitMQ核心知识体系全解(5大核心模块:Exchange类型、消息确认机制、死信队列、延迟队列、镜像队列)
java·前端·分布式·后端·spring·rabbitmq·mvc
小江的记录本3 小时前
【RocketMQ】RocketMQ核心知识体系全解(5大核心模块:架构模型、事务消息两阶段提交、回查机制、延迟消息、顺序消息)
linux·运维·服务器·前端·后端·架构·rocketmq
小比特_蓝光3 小时前
版本控制器Git/调试器gdb/cgdb使用
git
源码站~3 小时前
基于Spring Boot+Vue3的烹饪交流学习系统 设计与实现
java·vue.js·spring boot·后端·mysql·毕业设计·毕设