概述

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 -ysudo yum install git -ygit --versiongit 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" ]; thenecho "⚠️  No workspace mapped for branch '$current_branch'. Skipping deployment."exit 0
fi# 验证目标工作区是否存在
if [ ! -d "$target_workspace" ]; thenecho "❌ 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 ]; thenecho "✅ Successfully deployed to $target_workspace"
elseecho "❌ Deployment failed! rsync error code: $?"exit 1
fiexit 0

总结与思考

Git服务的安装和部署就写到这里,分支之间的 导出(archive)、忽略(gitignore)、隐藏(Stash)、合并冲突(merge)的解决方法在之前的博客中都做了充分的文档和说明,还是要多实践,实践才是检验真理的唯一标准。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/88704.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/88704.shtml
英文地址,请注明出处:http://en.pswp.cn/diannao/88704.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Redis原理】Redis数据结构底层原理

目录 一、SDS 二、IntSet(整数集合) 三、双向链表 四、压缩列表 五、字典(哈希表) 七、跳表 八、QuickList 九、RedisObject 一、SDS Redis 是用 C语言实现的,但是它没有直接使用C 语言的 char* 字符数组来实现…

C#.NET HttpClient 使用教程

简介 HttpClient 是 .NET 中用于发送 HTTP 请求和接收 HTTP 响应的现代化 API,它取代了过时的 WebClient 和 HttpWebRequest 类。 HttpClient 是 .NET Framework 4.5 和 .NET Core/.NET 5 中提供的、基于消息处理管道(message handler pipeline&#…

Nginx常用安全配置指南

Nginx是一个轻量级的,高性能的Web服务器以及反向代理和邮箱代理服务器。它运行在UNIX、GNU、linux、BSD、Mac OS X、Solaris和Windows各种版本。根据调查统计数据显示,当前全球超过6%的网站使用Nginx Web服务器来管理Web网站应用。 为了保证基于Nginx的…

【UniApp 日期选择器实现与样式优化实践】

UniApp 日期选择器实现与样式优化实践 发布时间:2025/6/26 前言 在移动端应用开发中,日期选择器是一个常见且重要的交互组件。本文将分享我们在 UniApp 项目中实现自定义日期选择器的经验,特别是在样式优化过程中遇到的问题及解决方案。通过…

推荐系统的视频特征-视频关键帧特征提取与向量生成

📌 总体流程概览 视频文件 (.mp4)↓ 关键帧抽取(FFmpeg / SceneDetect)↓ 帧图像(.jpg)↓ 图像模型提取特征(CLIP / CNN / ViT)↓ 多帧聚合成视频向量(均值池化等)↓ 向…

Apache SeaTunnel Flink引擎执行流程源码分析

目录 1. 任务启动入口 2. 任务执行命令类:FlinkTaskExecuteCommand 3. FlinkExecution的创建与初始化 3.1 核心组件初始化 3.2 关键对象说明 4. 任务执行:FlinkExecution.execute() 5. Source处理流程 5.1 插件初始化 5.2 数据流生成 6. Transform处理流程 6.1 插…

Vue 3 + Element Plus 实现「动态表单组件」详解教程

✅ Vue 3 Element Plus 实现「动态表单组件」详解教程 📌 适用场景:表单字段根据配置动态生成,支持校验、提交、自定义组件、复杂布局等。 🧩 技术栈:Vue 3 TypeScript Element Plus 🔧 核心特性&#x…

本地部署开源时间跟踪工具 Kimai 并实现外部访问( Windows 版本)

Kimai 是一款开源的时间跟踪工具,它易于使用,并提供了强大的报告功能,在个人和团队记录工作时间、项目时间和活动时间等之后可以帮助用户了解他们是如何花费时间的,从而提高生产力和效率。本文将详细介绍如何在 Windows 系统本地部…

系统分析师案例知识点

目录 1 必做题1.1 状态机图1.2 活动图1.3 统一软件开发过程RUP 2 需求分析2.1 数据流图DFD2.2 ER图2.3 状态转换图STD2.4 数据字典2.5 流程图2.6 需求评审2.7 设计类2.8 FAST分析2.9 常见的关系类 3 嵌入式3.1 容器技术3.2 虚拟机技术3.3 虚拟机和容器的不同点 4 数据库4.1 NoS…

多相机人脸扫描设备如何助力高效打造数字教育孪生体?

在教育数字化转型浪潮中,数字孪生体作为现实教育场景的虚拟映射,正成为智慧教育发展的关键技术支点。传统教育模式面临师资资源分布不均、个性化教学难以覆盖、跨时空教学场景受限等痛点,而数字孪生体通过构建高仿真虚拟教育主体(…

用 EXCEL/WPS 实现聚类分析:赋能智能客服场景的最佳实践

聚类分析作为无监督学习的核心技术,能在客服数据中发现隐藏的用户群体或问题模式。尽管 Excel/WPS 并非专业统计软件,但巧妙利用其内置功能,也能实现基础的聚类分析,为中小型客服团队提供快速洞察。以下介绍具体方法及智能客服场景…

基于定制开发开源AI智能名片S2B2C商城小程序源码的H5游戏开发模式创新研究

摘要 本文以定制开发开源AI智能名片S2B2C商城小程序源码为技术底座,探讨其在H5游戏开发中的创新应用。通过分析原生开发与第三方工具两种传统开发模式的局限性,提出将AI智能名片的多模态内容生成能力、S2B2C商城的生态协同机制与H5游戏开发深度融合的解…

vue3+ELInput无法输入的问题

vue3ElInput无法输入的问题 开篇 写业务的时候发现,因为想偷懒嘛,直接就在想在外部去定义一个变量,然后写个弹窗里(tsx)的el-input,而不是又去写个vue页面,但发现就输入不了了,而且…

SQL Server:如何检测和修复 FILESTREAM 数据库损坏?

SQL Server 中的 FILESTREAM 功能可以将二进制大型对象 (BLOB) 存储到文件系统上,而不是将它们存储在数据库中。但是,默认情况下不启用此功能。用户需要使用 SQL Server Management Studio (SSMS) 和 SQL S…

FORCE 开发者论坛 | 火山引擎发布多款 Agent 开发工具

资料来源:火山引擎-开发者社区 6 月 12 日,2025 火山引擎 FORCE 原动力大会开发者论坛成功举办。大会聚焦 Agent 开发新范式,升级发布了 PromptPilot、MCP Servers、TRAE、扣子开发平台等产品,以及多款开源项目,构建起…

【Qt-windows】如何使用perfmon 具体分析windows serverR2的Qt程序CPU问题

可以使用 Windows 自带的 PerfMon(Performance Monitor) 工具对运行在 Windows Server R2 上的 Qt 程序进行详细的性能分析,尤其是 CPU 使用情况。以下是具体的操作步骤和建议: 一、打开 PerfMon 工具 按下 Win R 打开运行窗口。…

【软考高级系统架构论文】论NoSQL数据库技术及其应用

论文真题 随着互联网web2.0网站的兴起,传统关系数据库在应对web2.0 网站,特别是超大规模和高并发的web2.0纯动态 SNS 网站上已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。 NoSQL(Not only SQL )的产生就是为了解…

bash的配置文件,source

一.按生效范围分类 二.按shell登录的方式分类 这里的执行顺序存疑,因为会互相调用,不需要记忆 source执行脚本 source不创建子进程,bash创建子进程 普通脚本:用bash 配置文件脚本:用source 三.按功能分类

30道C语言高频题整理(附答案背诵版)

1.请描述一下C语言的基本数据类型有哪些? C语言提供了一系列的基本数据类型,它们是构建更复杂数据结构的基础。这些基本数据类型主要包括: 整型(Integer Types):用于存储整数值。根据存储大小和符号性&…

使用Tailwind CSS和i18n的react实践

首先在 src 下设置 i18n.js 文件 // src/i18n.js import i18n from i18next; import { initReactI18next } from react-i18next;import en from ./locales/en/public; import zh from ./locales/zh/public;i18n.use(initReactI18next) .init({resources: {en: { translation:…