自建私有git进行项目发布

自建私有git进行博客项目发布

之前尝试过通过建立私有git仓库,来发布自己的hexo静态博客,但是失败了,今天尝试了一下午,算是有了结果。下面记录我的过程。

我的需求:

我有一个服务器,希望在服务器端建一个git仓库,本地部署时会同时往GitHub,服务器多个地方部署,但是主要的访问是通过服务器端的 nginx

即本地 hexo d 命令能够往服务器 git 的进行部署,同时在 github 留有备份。服务器中 nginx 会设置网站根目录为指定的某个目录。

整体思路

本地项目通过git 上传至服务器端建立的 裸仓库gitpush 操作会触发 git 的钩子函数, 钩子函数进入在我们的项目目标目录,执行 pull 操作,将所有的改变拉取到项目目录并合并。

nginx 会将网站根目录设置为项目目录,就可以正常访问了。

服务器端

建议使用有 sudo 权限的用户新建 git 用户,而不是 root 用户。

1 新建一个Git用户

首先需要安装 git ,具体方法根据自己系统搜索进行安装。

sudo useradd git

2 配置访问权限

我们需要无需密码验证登录 git 账户,需要将本机的公钥文件内容 C:\Users\用户名\.ssh\id_rsa.pub 复制到 /home/git/.ssh/authorized_keys 中。

这样就能无密码登录 git 用户,可以使用 ssh -T git@101.35.203.216 命令进行验证。

3 建立裸仓库

选定目录建立裸仓库,我的是 /home/git/blog.git ,在 /home/git 目录下执行命令:

sudo git init --bare blog.git
# 同时还要将仓库所属用户修改为git
sudo chown -R git:git blog.git

裸仓库没有工作区,也就是你根本没法看到上传上来的文件。之后我所有的静态博客文件即 public 目录下的文件都会上传到裸仓库。那如何拿到文件呢?

我采用 git 钩子函数的特性,当有本地有 push 代码到裸仓库的操作时,便自动执行一个脚本,把仓库中的文件拉取到我的项目目录 /home/git/public 中,这样我就可以正常的用 nginx 访问我的博客项目了。

4 添加钩子函数

在裸仓库 /home/git/blog.git/hooks 目录中,新建 post-receive 文件

vim post-receive # 新建文件

输入内容

#!/bin/bash
unset GIT_DIR # 似乎挺重要的,可能与环境变量有关
DIR=/home/git/public # 项目目录
echo "Starting Upadte!" # 调试用的
git config --global --add safe.directory /home/git/public # 中途代码提示建议我添加的,我就加上了
cd $DIR # 进入项目目录
git pull /home/git/blog.git main # 拉取裸仓库并与本地分支合并
echo "Update Sucess!" # 调试用的

其实这里大部分操作和 git 命令和 bash 环境相关,看来还是需要去学习下了。

注意还要将 post-receive 文件所属用户改为 git ,且添加执行权限,不然无权访问。

sudo chown -R git:git post-receive
sudo chmod +x post-receive

5 禁止Git用户登录Shell

编辑 /etc/passwd 文件,找到下面类似内容:

git:x:1009:1009:git daemon user:/:/bin/bash

修改为:

git:x:1009:1009::/home/git:/usr/bin/git-shell

这样 git 用户就无法登录shell了。

6 添加项目目录

在自己想要的地方添加项目目录,我的是 /home/git/public , 在目录中需要进行仓库初始化,因为这个目录之后要执行 pull 操作

git init # 初始化仓库

还要注意,这个项目文件要让 git 用户有权限访问

sudo chown -R git:git /home/git/public # 让git所有

本地客户端

1 本地调试

本地可以新建一个文件夹进行调试。

git init
git remote add origin git@101.35.203.216:/home/git/blog.git
git add .
git commit -m "test"
git push -u origin main

注意调试之后还要让服务器端的项目commit记录为空,因为正式使用时会有 git 记录不一致的情况。

当然如果 git 操作一流,能够处理此种情况,算我没说。

2 博客配置

本地Hexo博客项目配置文件 _config.yml 中我进行了修改:

deploy:
- type: gitrepository:github: git@github.com:anda522/anda522.github.io.gitgitee: git@gitee.com:wyqz/wyqz.gitbranch: master
- type: gitrepository: git@101.35.203.216:/home/git/blog.gitbranch: main

执行 hexo d 命令后,就会将生成的前端文件上传至自建的裸仓库。

注意项目

注意点

  • 各种权限问题,登录账户为 git ,需要时刻注意某些文件能不能用 git 用户访问
  • git 的各种命令的理解, pull push 等,需要了解
  • bash 的环境变量问题,没有了解过很容易出问题

参考:

  • https://52gvim.com/post/git-server

  • https://blog.csdn.net/Shen_Junxiao/article/details/85245390

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

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

相关文章

阿里云RDS提示过期释放实例了怎么找到库表

做朋友,不需要资格!——《全职猎人》 直截了当 一步到位 ~

【数据结构和算法】--队列的特殊结构-循环队列

目录 循环队列的结构循环队列的实现循环队列的创建循环队列为空判断循环队列为满判断入队出队返回循环队列首元素返回循环队列尾元素释放循环队列 循环队列的结构 循环队列是队列的一种特殊结构,它的长度是固定的k,同样是先进先出,理论结构是…

飞翔的鸟。

一.准备工作 首先创建一个新的Java项目命名为“飞翔的鸟”,并在src中创建一个包命名为“com.qiku.bird",在这个包内分别创建4个类命名为“Bird”、“BirdGame”、“Column”、“Ground”,并向需要的图片素材导入到包内。 二.代码呈现 pa…

大数据分析的流程有哪些

数据的采集和收集。大数据预处理。大数据建模和大数据方法。大数据分析和结果展示。

Python与CAD系列高级篇(二十三)导入坐标点txt

0 简述 本篇介绍以下功能开发:从txt文本中导入坐标点。 1 需求 需求: ① 坐标点以特定分隔符储存在txt文件中。 ② 从txt文本中导入坐标点到cad。 2 代码实现 代码实现(导入到dxf文件): doc = ezdxf.new(dxfversion=R2007) msp = doc.modelspace

MySql基础命令(MySql学习——四)

##退出命令: \nmysql > exit; \nmysql > quit; \nmysql > \\q;\n\n ##修改MySQL的提示符: \nmusql -u root -p yourPassword --提示符、连接上客户端 prompt 提示符 提示符参数 D 完整的日期 \d 当前数据库 \h 服务器名称\n \u 当前…

ChatGPT4 Excel 高级组合函数用法index+match完成实际需求

在Excel 函数用法中有一对组合函数使用是非常多的,那就是Index+match组合函数。 接下来我们用一个实际的需求让ChatGPT来帮我们实现一下。 我们给ChatGPT4发送一个prompt:有一个表格A2至A14为业务员B列至H列为1月至7月的销售额,请根据J2单元格的业务员与K2单元格的月份查找出…

LVS负载均衡群集,熟悉LVS的工作模式,了解LVS的调度策略以及ipvsadm工具的命令格式

目录 一、什么是群集 群集的作用: 群集的目的是什么 根据群集所针对的目标差异,可分为三种类型 负载均衡群集(LBC)load balance cluster 高可用群集(HAC)high availability cluster 高性能运算群集&a…

ChatGLM-6B模型结构组件源码阅读

一、前言 本文将介绍ChatGLM-6B的模型结构组件源码。 代练链接:https://huggingface.co/THUDM/chatglm-6b/blob/main/modeling_chatglm.py 二、激活函数 torch.jit.script def gelu_impl(x):"""OpenAIs gelu implementation."""r…

PostgreSQL 获取指定根节点及其所有子集的id

要获取所有子集的ID,您可以使用递归CTE(WITH RECURSIVE)查询来实现。以下是一个示例查询语句: WITH RECURSIVE cte AS (-- 选择指定根节点ID的id和parent_idSELECT id, parent_idFROM your_tableWHERE id ? -- 填写根节点的IDU…

C#编程语言简介

C#(发音为C Sharp)是微软公司开发的一种现代的、类型安全的、面向对象的编程语言。它于2000年首次亮相,并在随后的几年内迅速发展成为一个广受欢迎的编程语言。C#是.NET框架和.NET Core平台的重要组成部分,这些平台提供了丰富的库…

2020 ICPC·小米邀请赛 决赛 J. Rikka with Book(状压dp)

题目 登录—专业IT笔试面试备考平台_牛客网 n(n<20)本书&#xff0c;放在桌子上&#xff0c; 第i本书的可以看成是li(li<1e3)*1*1的物体&#xff0c;其中长为li&#xff0c;宽为1&#xff0c;高为1&#xff0c; 质量均匀分布&#xff0c;且为wi(wi<1e3) 求n本书摞…

基于linux系统的Tomcat+Mysql+Jdk环境搭建(二)jdk1.8 linux 上传到MobaXterm 工具的已有session里

【JDK安装】 1.首先下载一个JDK版本 官网地址&#xff1a;http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 下载1.8版本&#xff0c;用红框标注出来了&#xff1a; 也许有的同学看到没有1.8版本&#xff0c;你可以随便下载一个linux的…

简述框架与函数库的区别

框架和函数库是两个不同的概念&#xff0c;它们有着不同的作用和使用方式。 框架&#xff08;Framework&#xff09;是一种具有完整架构、设计模式和组件化的软件开发工具。它提供了一整套的解决方案和开发规范&#xff0c;通过封装和抽象化&#xff0c;使得开发者能够更加高效…

Cmake基础(3)

这篇文章也是一个无三方库的单项目 根据位数和模式分目录存放可执行文件&#xff0c;而且可执行的文件名中包含了位数、模式和编译器。 目录 给出cmake文件使用mingw的结果cmake中的一些知识点变量设置与访问cmake中的函数cmake的预定义 本文有以下几个要点 cmake中常用路径的…

平均数 C语言xdoj66

问题描述 计算n个整数&#xff08;x1,x2,x3...&#xff09;的平均数&#xff0c;结果保留两位小数。 输入说明 第一行为整数n&#xff08;1 < n <100&#xff09;&#xff0c;接下来是n个整数(0 < x1,x2,x3....< 2^31 - 1)。 输出说明 输出这n个整数的…

电商平台的易聊集成:无代码开发,API连接,CRM支持

连接电商与客服&#xff1a;易聊的创新解决方案 在迅速变化的电子商务市场中&#xff0c;企业要想保持竞争力&#xff0c;就必须拥有高效灵活的客服体系。易聊&#xff0c;一家领先的AISaaS服务商&#xff0c;正是基于这一需求&#xff0c;推出了一系列创新产品。它们通过智能…

西南科技大学数据库实验三(SELECT查询操作—简单查询)

一、实验目的 了解查询的概念和方法 掌握select语句在单表查询中的应 掌握select语句在多表查询中的应用 掌握select语句在复杂查询中的实验方法 二、实验任务 输入指令 showvariableslike ‘%char%’ ; 展示字符默认设置 将Variable_name中client、

C/C++ STL提供的关联式容器之map

map 由红黑树实现&#xff0c;其元素都是 “键值/实值” 所形成的一个对组&#xff08;key/value pairs)。 map 主要用于资料一对一映射的情况&#xff0c;map 内部自建一颗红黑树&#xff0c;这颗树具有对数据自动排序的功能&#xff0c;所以在 map 内部所有的数据都是有序的…

Vue2-动态组件案例

1.component介绍 说明&#xff1a; Type: string | ComponentDefinition | ComponentConstructor Explanation: String: 如果你传递一个字符串给 is&#xff0c;它会被视为组件的名称&#xff0c;用于动态地渲染不同类型的组件。这是一个在运行时动态切换组件类型的常见用例。…