Hexo历险记之九Git远程仓库

前言

Git环境之前我们已经在本地安装过了,现在也可以用SSH连接到服务器上了,那么接下来就是要在服务器上面安装Git,并且建立一个远程仓库来帮助我们完成部署过程。

这篇文章,我会告诉你如何升级Linux系统的Git版本,以及建立远程仓库,用钩子实现分离仓库和文件内容,最后用一条命令行完成部署Hexo博客。

时隔四年,重启Hexo历险计划!

Hexo历险记之九Git远程仓库

其实在本系列的第三篇文章中,已经与伙伴们详细解释了如何安装Git环境,可能当时还不甚理解。我也不是故意卖关子,说不用着急配置他,而是因为只有到了这个需要远程部署的时候,才是真的需要使用他。一语带过我是解释不清的,而详细展开又会影响到安装Hexo的理解,所以才放到这里。

张三有话说

张三:我有问题,你不给我解答,我就不看你叨叨的这一堆东西了。明明SSH也是可以复制文件的啊,为什么还要用Git呢

君匡:因为我们要用Git实现版本控制啊,编写完一篇博客后,提交部署,其实只是需要更新这一篇内容吧,其他内容都不会涉及改动的。虽然用SCP命令也可以复制渲染页面,但是就会缺少版本管理的功能,发生文件丢失,缺损,当我们想要找回之前删除的一句话时,连回滚文件都做不到。

张三:好吧好吧,你说的有道理。那么我用低版本的Git也不行,非得要我升级?

君匡:其实没必要非得追求最新版的Git,低版本的Git也可以实现版本控制的,比如1.8.*。但是过低的版本会缺少功能且有安全隐患,比如CVE-2022-24765、CVE-2022-24767就是低版本Git无法抵御的问题,只有升级到2.35.2才能起到限制作用,所以建议你升级Git。

张三:那么,我们为什么要创建远程仓库呢?明明本地已经有一个仓库了呀,还要单独配置真的很麻烦,难道不能够省略么?

君匡:必须使用Git建立一个远程仓库,我们才可以将本地渲染出来的文章页面用命令传输到服务器上,而这种传输方式以后是经常用的。单独配置远程仓库则是为了能够保存文件变动记录的同时,将具体的文件也保存到路径里。

张三:行,那我就再看看你叨叨的这一堆东西。

君匡:(/和蔼笑/握拳)

本地配置Git

之前已经在本地安装过Git环境了,那么接下来就是要配置Git了。

在拉取和上传文件的时候,Git会记录是谁发起了变动,而标识的方式就是用名字和邮箱,所以必须全局配置。

# 格式 git config --global user.name "yourname"
# 格式 git config --global user.email youremail@example.com

git config --global user.name "junkuang"
git config --global user.email 123@qq.com

为了以后上传博客时候不会出现下图警告,就再加上一条禁用自动转换。

image-20210530142928758
git config --global core.autocrlf false

在Git 客户端上设置缓冲区大小,以增加仓库对单个文件大小的限制,当推送大量数据时尤为有用。

git config --global http.postBuffer 157286400

服务器升级Git

正如在前言所说,如果你不升级,低版本的也是可以正常实现功能的,但是在骇客的眼里就几乎是不设防的。如果你认为在远程服务器上又没有什么重要的东西,不想费力升级,那么你可以直接跳到建立远程仓库的部分。

在安装新版本的时候,你其实有两个选择,一个就是仍然使用包管理进行安装,好处是方便快捷,缺点就是无法指定小版本。另一个就是直接从网站上下载压缩包,直接编译安装,缺点是操作繁杂,优点是可以任意选择版本,也可以离线。

查看版本

运行命令查看Git版本,发现自带了1.8.3.1  版本的。

git --version 
image-20220729115401064

卸载低版本

示例服务器的系统为CentOS,所以包管理器就是yum,如果你是其他的LInux系统,那么你就用你的包管理器来卸载应用。

: 卸载低版本的 Git
yum remove git -y 

安装新版本-使用包管理器

新增Rpm第三方源IUS,然后使用yum即可安装。

# 新增Rpm第三方源IUS
yum install -y \
 https://repo.ius.io/ius-release-el7.rpm \
 https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

# 搜寻Git2.*版本
yum search git2  --color=auto 
image-20220729121158337

从结果可以知道,现在仓库里可以安装的版本为2.36,于是直接用命令安装即可。

# 安装git2.36
yum install -y git236

安装新版本-使用安装包

下载安装包

在任意可以联网的机器打开git的下载网页,以安装2.35.2版本为例,下载安装包git-2.35.2.tar.gz。也可以直接在服务器上用wget命令直接下载。

: 下载到文件夹/usr/local/git里,会自动创建目录
wget -P /usr/local/git  https://www.kernel.org/pub/software/scm/git/git-2.35.2.tar.gz 

: 如果上一条报错了,就加上不检查的参数重新下载
wget -P /usr/local/git  --no-check-certificate  https://www.kernel.org/pub/software/scm/git/git-2.35.2.tar.gz 
  • -P:指定下载目录,于是下载下来就是/usr/local/git/git-2.35.2.tar.gz
  • --no-check-certificate:不检查直接下载
image-20220729125101943

安装Git

在服务器上先安装依赖,然后切换到存放目录,解压后配置安装路径,接着编译并安装。

: 安装依赖
yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker -y 

: 切换到存放目录
cd /usr/local/git 

: 解压到同级目录
tar -zxvf git-2.22.1.tar.gz 

: 进入路径,此时可删除安装包,也可以留作备份
cd git-2.22.1 

: 配置git安装路径
./configure prefix=/usr/local/git/ 

: 编译并且安装
make && make install 

添加到环境变量

修改服务器上的/etc/profile文件,添加内容如下,目的是在任何目录都可以使用git命令。

注意:一定要备份文件/etc/profile,否则很可能就要重装系统了!!!

export PATH=/usr/local/git/bin:$PATH

修改后重新加载该配置文件,在任意目录调用git命令,测试是否生效。

source etc/profile

进行配置软连接

如果/usr/bin/目录下没有git-upload-packgit-receive-pack 文件,那么还要多设置软连接,不然后面克隆时有可能会报错。

: 格式 ln [-sf] 源文件 目标文件

ln -s /usr/local/git/bin/git-upload-pack /usr/bin/git-upload-pack

ln -s /usr/local/git/bin/git-receive-pack /usr/bin/git-receive-pack 
  • -s: 就表示创建软链接了,不加的话就是创建硬链接

  • -f: 表示存在的时候删除再创建

建立远程仓库

裸仓库和空仓库

新建立一个仓库时,是需要区分该仓库是裸仓库还是空仓库。

一般来说,裸仓库是不储存文件的,所有变动都会以变动记录的方式存储在仓库里;而空仓库是既有变动记录又有具体文件的,但是其他主机就不能够提交信息内容给master分支了。

: 新建空仓库
git init demo1.git

: 新建裸仓库
git init --bare demo1.git

那可就难过了,因为我们要在服务器上面建立一个既能储存文件还要能够接受信息提交的仓库啊。

不过没关系,在裸仓库接受信息后用一个钩子文件指定具体文件的位置就可以解决了。

新建用户

由于Linux系统的限制,所有文件都要归属到用户的权限上来,以此维护系统关键文件不会轻易被改动。这里要求新建一个用户,目的是为了更好地管理文件权限,尤其是在下一篇,我会详细说如何用Nginx实现端口转发。那时候这个新建的用户就会起到大作用了。

新建一个用户,用户名以keen为例。配置密码后,将他添加到用户组里以获得sudo权限。

: 新增用户
adduser keen

: 修改密码,之后要输入两次同样的密码
passwd keen 

: 添加到wheel用户组里,获取sudo的权限
usermod -aG wheel keen 

建立裸仓库

在服务器上切换到刚刚新增的用户,创建一个项目真实存在的目录,再创建一个仓库目录。

: 切换用户
su keen

: 项目存在的真实目录
mkdir -p /home/keen/projects/blog

: 项目仓库目录
mkdir -p /home/keen/repos

: 进入仓库目录并
cd /home/keen/repos

: 创建一个名为blog.git的裸露仓库
git init --bare blog.git 

测试Git仓库是否可用,在本地创建空白文件夹,执行如下命令。

: 格式 git clone 仓库目录
git clone keen@39.96.12.167:/home/keen/repos/blog.git

: Cloning into 'myblog'...
: warning: You appear to have cloned an empty repository.

输入密码之后,如果能把空仓库拉取下来,就说明 git 仓库搭建成功了。

建立钩子文件

使用的是 post-receive ,这个会在我们每次推送消息之后,把部署目录更新到博客的最新生成状态,这样便可以达到部署最新博客的目的。关于 hooks 的详情内容可以参考这里。

先修改下面的内容,注意具体地址要跟实际情况一致!

#!/bin/sh
git --work-tree=/home/keen/projects/blog --git-dir=/home/keen/repos/blog.git checkout -f
  • --work-tree:指定实际文件存储目录
  • --git-dir:指定仓库目录

接着用如下命令创建钩子文件,先按i,底下出现一个插入的文字。将上面的内容粘贴进来,之后按esc键再输入:wq保存并退出。

: 建立钩子文件
vim /home/keen/repos/blog.git/hooks/post-receive

不要忘记设置权限,不然是不会生效的。

: 用keen用户赋予post-receive权限
chmod +x /home/keen/repos/blog.git/hooks/post-receive
: 退出到root
exit 

: 用root用户赋予权限
chown -R keen:keen /home/keen/repos/blog.git/
chown -R keen:keen /home/keen/projects/blog/

注意:如果你是在本地Windows上创建的文件,修改后再上传到服务器,那么你需要使用工具dos2unix转换回车符。

yum install -y dos2unix

dos2unix post-receive

Hexo博客部署

经过上面的操作,远程仓库已经成功建立起来了。我们接下来就是要把本地的变动推送到远程服务器,实现Hexo博客部署。

致敬官网hexo-deployer-git。

一般来说博客初始化的时候,自己就会安装这个插件。即使没有,用下面的命令也可以安装插件。

npm install hexo-deployer-git --save

修改博客根目录的配置文件,可以同时部署多个仓库。

deploy:
  - type: git
 repo: 
        ali1: git@39.96.12.167:/home/keen/repos/blog.git
        ali2: git@39.96.12.168:/home/keen/repos/blog.git

从此以后,在编写博客后,就可以直接在博客根目录运行命令,同时发布多个博客了。

hexo deploy
image-20220729143509855

现在,已经将博客完整地推送到了远程服务器上,但是还无法直接访问,下一篇,我会演示如何安装并使用Nginx实现端口转发,让你能够随时随地访问博客内容。

感谢

感谢过去的好奇,也幸好有现在的重温,为了能成为更好的自己。

  1. 使用 Git Hook 自动部署 Hexo 到个人 VPS
  2. "remote:error:refusing to update checked out branch:refs/heads/master"的解决办法
  3. git init 和git –bare init 的具体区别
  4. git-upload-pack:command not found问题
  5. centos7下git的安装和配置
  6. centos7.4git安装
  7. linux类似于Windows的桌面快捷方式
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容