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版本和配置管理员信息

# 安装 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这个目录作为整个远程分支的根节点。


# 创建专用 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可以配置多个成员。
# 创建 .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分支的工作区

# 初始化版本库
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.在本地仓库,克隆拉去远程分支

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,解决办法如下:

# 如果你在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的工作区目录中。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stark张宇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值