使用git分支保存hexo博客源码到github

hexo是当前最火的静态博客框架,支持Markdown格式文章编辑并自动生成对应的静态网页,简单高效令人爱不释手。
使用hexo写博客的流程通常是,

  1. 通过hexo new post_name命令,会自动在source/_post目录下生成一个待写的post_name.md文件
  2. 编写完该md文件后,用hexo generate编译生成对应的HTML文件
  3. 发布之前,可以用hexo s本地预览,然后通过hexo deploy发布到远程仓库的master分支,然后你的个人站点就能看到刚才新加的文章了

一、困扰

然而,使用过hexo搭建个人博客的朋友们想必都会遇到博客源码保存的问题。即远程仓库只会保存hexo发布后的静态HTML文件,你的博客md源文件、主题配置等还在本地,一旦电脑磁盘坏了或者换了电脑,就无法在之前仓库的基础上继续写博客。针对此问题,有不少博主会在github上单独另起一个repository来专门保存博客源文件,每次发布完新文章,需要手动地将source/post下的md文件上传到源文件对应的repository,确实也能解决问题,但总归是麻烦。后来偶然看到聪明的网友借助git分支来巧妙地实现用同一个仓库保存静态网页和博客源码,自己试了下确实很赞,故总结之。

二、为什么要备份

这篇文章中我们把HexoGithub结合起来搭建了自己的个人博客,hexo d部署到Github的其实Hexo编译后的文件,这些文件是用来生成网页的,并不包含我们的源文件:

img

20220511_01.png

它其实上传到Github 的是在我们本地目录里的.deploy_git里面的内容:

img

20220511_02.png

我们的源文件比如相关source文件、配置文件等都是没有上传到Github上的,所以我们要利用git来做分支管理,对我们的源文件进行备份,这样我们就可以在另一台电脑上把源文件clone到本地安装相应的环境就可以继续写我们的博客了。
好了,废话少说,我们直接来说如何进行博客源文件的备份。

Hexo博客备份

创建新分支

Github上博客仓库下创建一个新的分支hexo,并且将这个分支设置为默认分支,具体操作如下:

img

20220511_03.png

20220511_03.png

img

20220511_04.png

img

20220511_05.png

克隆hexo分支

在本地把我们刚建的分支hexo克隆到本地:

1
# git clone -b <远程指定分支> <远程仓库地址> <本地文件夹名>
1
git clone -b hexo git@github.com:aiyoja/aiyoja.github.io.git ./blog

以上格式成功了

下面这个失败不知道原因

1
git clone https://github.com/aiyoja/aiyoja.github.io.git
img

20220511_06.png

把克隆下来的项目里面的.git文件复制到我们的Hexo博客目录下:

img

20220511_07.png

注意:如果之前搭建博客的时候自己更换过主题文件的,请把主题文件里面的.git文件删除。

多机同步更新的前提:hexo分支

必备文件

Hexo博客系统中影响迁移的只有一部分文件和文件夹,所以只需要备份它们即可

文件(夹) 说明
scaffolds/ 博客文章的模版
source/ 所有博客文章,以及about、tags、categories等page
themes/ 网站的主题
.gitignore 在push时需要忽略的文件和文件夹
_config.yml 站点配置文件
package.json 依赖包的名称和版本号

我们要做的就是通过各种方式备份这些文件和文件夹,比如说以下两种静态备份方式:

  1. 通过U盘或移动硬盘保存
  2. 通过网盘保存

上述两种方式可以用于备份不经常改变的文件,可是我们需要备份的比如博客文章、Hexo配置文件和主题配置文件是需要经常更改的,所以需要其它方式动态备份

参考其它博客了解到可以通过创建Hexo博客系统的分支进行备份

Hexo博客站点的必要文件:

1
2
3
4
5
6
7
8
.
├── scaffolds # 文章模板
├── source # 用户源文件:页面,文章markdown文件
├── themes # 主题
├── .gitignore # git忽略文件信息
├── _config.yml # 站点配置文件
├── package.json # 已安装插件映射表,下次只需npm install即直接安装表中的插件
├── package-lock.json

编辑站点根目录下的.gitignore文件,使Git上传时忽略不必要的文件:

1
2
3
4
5
6
7
.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/

1.删除themes你的主题中的.git.github.gitignore等git仓库文件,只保留站点根目录下的.gitignore

2.在Hexo博客站点根目录(即blog文件夹)中GitBash:

1
2
3
4
5
6
7
8
9
10
11
12
# 将blog作为一个git仓库进行初始化
$ git init
# 创建/切换hexo分支
$ git checkout -b hexo
# 将文件添加到暂存区
$ git add .
# 将暂存区文件提交到本地仓库
$ git commit -m "提交说明"
# 添加远程仓库
$ git remote add origin https://github.com/yourname/yourname.github.io.git
# 将本地仓库推送至远程仓库hexo
$ git push origin hexo

开始备份

进入到Blogs根目录下,执行如下命令:

1
2
3
git add .
git commit -m "Blog源文件备份"
git push origin hexo

这时候我们会看到Github上的hexo 分支就有我们的源文件了。

img

20220511_08.png

如果你想要每次更改东西都希望备份到hexo 分支上,可以执行如下步骤:

1
2
3
4
5
hexo clean
git add .
git commit -m "备份"
git push
hexo g & hexo d

如何恢复博客

假设我们换电脑了,要在新环境继续在原有仓库基础上撸文章,此时通过git clone将博客源码拉到本地,然后安装、初始化hexo就能搞定:

1
2
3
4
5
6
7
8
9
10
11
12
git clone https://github.com/sherlockyb/sherlockyb.github.io.git sherlockyb
cd sherlockyb
npm install hexo
npm install hexo-deployer-git -save

// 别忘了安装相关依赖的 NodeJS 包,也就是 _config.xml 中用到的一些插件
npm install hexo-wordcount
...

// hexo环境配置好后,继续像之前一样
hexo new post_name
...

假如我们现在更换了电脑,希望在新的电脑上继续写博客,把Githubhexo分支上的项目克隆到本地(注意:是我们备份的那个分支)

进入到克隆下来的文件夹,执行如下命令:

1
2
npm install hexo-cli
npm install hexo-deployer-git

然后再去安装主题相关的插件即可,当然如果你电脑上还没有 Node.js等环境的话可能还需要去安装相关的环境。
现在我们就基本上可以在另一台电脑上继续我们的博客之旅啦~

2.博客还原—–比上面详细

1
2
3
4
5
6
7
8
9
10
# 克隆hexo分支到本地
$ git clone -b hexo https://github.com/yourname/yourname.github.io.git
# 进入yourname.github.io文件夹
$ cd yourname.github.io
# 安装hexo
$ npm install hexo --save
# 安装hexo命令行模式
$ npm install hexo-cli -g
# 安装所有依赖,根据package.json自动安装之前安装过的插件
$ npm install

3.配置网络协议

(1) SSH协议,长期部署推荐SSH,一劳永逸。

①SSH秘钥:

1
2
3
4
5
6
# 生成rsa秘钥
$ ssh-keygen -t rsa -C "youremail@example.com"
# 进入虚拟目录ssh文件中
$ cd ~/.ssh
# 显示id_rsa.pub文件内容
$ cat id_rsa.pub

②复制秘钥至github/coding->用户setting->SSH keys,New SSH Key;

③验证是否添加成功

1
2
$ ssh -T git@github.com  # 验证github是否添加成功
$ ssh -T git@coding.net # 验证coding是否添加成功

④编辑站点配置文件_config.yml

1
2
3
4
5
6
deploy:
type: git
repo:
github: git@github.com:yourname/yourname.github.io.git
coding: git@git.coding.net:yourname/yourname.coding.me.git
branch: master

⑤添加远程仓库

1
$ git remote add origin git@github.com:yourname/yourname.github.io.git

(2) HTTPS协议,临时部署推荐HTTPS。

①直接编辑站点配置文件_config.yml

1
2
3
4
5
6
deploy:
type: git
repo:
github: https://github.com/yourname/yourname.github.io.git
coding: https://git.coding.net/yourname/yourname.coding.me.git
branch: master

②验证github/coding用户名和密码。

③添加远程仓库

1
$ git remote add origin https://github.com/yourname/yourname.github.io.git

4.正常使用

重新部署:

1
2
$ hexo clean
$ hexo g -d

上传至hexo分支:

1
2
$ git add .
$ git commit -m "commit-message"

注意事项

确保hexo deploy推送的是master分支,hexo目录下的_config.yml文件通常会配置deploy推送的目标地址,这个一般在最初使用hexo时,就会配置为master,不用改动:

1
2
3
4
5
6
# Deployment
## Docs: https://hexo.io/docs/deployment.html
deploy:
type: git
repo: https://github.com/sherlockyb/sherlockyb.github.io.git
branch: master

最后

到这里,如何备份Hexo博客以及如何恢复Hexo博客就基本结束啦。

更多关于Hexo框架和butterfly主题配置可以移步aiyoja的个人技术博客

(另一版本,作为参考)

创建分支目录

先新建一个hexo文件夹,作为分支的工作目录,用于保存将要备份的文件和文件夹

1
$ mkdir hexo1

再把GitHub上的Hexo仓库clone到hexo文件夹中

1
$ git clone https://github.com/widiot/widiot.github.io hexo1

删除除了.git文件夹的其它所有文件和文件夹,主要是为了得到版本管理的**.git**。下面命令不会删除隐藏文件和文件夹

1
2
$ cd hexo
$ rm -r * 12

最后把需要备份的文件和文件夹都复制到hexo文件夹下,hexo的目录结构应该如下

1
2
3
4
5
6
7
scaffolds/
source/
themes/
.git/
.gitignore
_config.yml
package.json1234567

如果使用的主题是从GitHub克隆的,那么主题文件夹下有Git管理文件,需要将它们移除,我使用的是hexo-next,需要移除的文件如下

1
$ rm -R themes/next/.git*1

创建分支

创建一个叫hexo的分支

1
$ git checkout -b hexo1

保存所有文件到暂存区

1
$ git add --all1

提交变更

1
$ git commit -m "创建hexo分支"1

推送到GitHub,并用--set-upstream与origin创建关联,将hexo设置为默认分支

1
$ git push --set-upstream origin hexo1

合并管理

现在我们的博客系统有两个需要管理的文件夹,一个是hexo,另一个是username.github.io,每次发表新文章都需要分别对这两个文件夹进行提交管理,显然是很蠢的行为

因为我们需要手动管理的只是hexo中的文件,而**.gitignore**之外的文件由Hexo管理,所以可以将这两个文件夹进行合并管理

之前已经将需要备份的文件加入了hexo分支,所以直接将hexo分支中的**.git文件夹复制到username.github.io**文件夹中

1
$ cp -a .git ../widiot.github.io1

查看当前的分支,确保处于hexo分支下

1
2
$ cd ../widiot.github.io
$ git branch -v12

还需要移除主题目录下的Git管理文件

1
$ rm -R themes/next/.git*1

查看Git当前状态,还需要对.gitignore文件进行编辑,确保忽略不备份的文件

1
$ git status1

master分支的文件则需要Hexo进行管理,编辑 _config.yml站点配置文件,设置branch为master

1
2
3
4
deploy:
type: git
repo: https://github.com/widiot/widiot.github.io
branch: master1234

发表文章

新建Markdown文章,编辑文章

1
$ hexo new test1

将相关更改推送到hexo分支

1
2
3
$ git add .
$ git commit -m "发表文章test"
$ git push origin hexo123

将静态文件推送到master分支

1
2
$ hexo clean # 如果配置文件没有更改,忽略该命令
$ hexo g -d12

在GitHub上查看hexo分支如下图所示

img

迁移

将hexo分支克隆下来

1
$ git clone -b hexo https://github.com/widiot/widiot.github.io1

然后安装Hexo依赖

1
$ npm install1

这样就可以简单的将Hexo博客迁移到任何电脑上了 : )

只是每次发表新文章要输入很多命令和密码 : (

使用git命令提交远程github仓库的时候提示rejected(拒绝)解决办法

今天使用在自己笔记本本地磁盘上使用Git命令行执行”git push”然后输入github的用户名和密码之后,报如下错误:

1
2
![rejected]  master->master(fetch first)  
error:failed to push some refs to 'https://github.com/xxx/xxx.git'

img

最后执行git pull,然后再执行push就可以了:

img

原因是:刚才在网站上改了README.md文件,添加了一些项目的说明,然后使用Git客户端再次提交的时候,需要先更新服务器上的变化,然后才能提交,也就是先更新再提交。

img

今天使用在自己笔记本本地磁盘上使用Git命令行执行”git push origin hexo”报如下错误:

![rejected] hexo->hexo(fetch first) error:failed to push some refs to 'https://gitee.com/xxx/xxx.git'

最后执行git pull,然后再执行push就可以了:

原因是:刚才在网站上改了README.md文件,添加了一些项目的说明,然后使用Git客户端再次提交的时候,需要先更新服务器上的变化,然后才能提交,也就是先更新再提交。

今天使用在自己笔记本本地磁盘上使用Git命令行执行”git push”然后输入github的用户名和密码之后,报如下错误:

![rejected] master->master(fetch first)
error:failed to push some refs to ‘https://github.com/xxx/xxx.git’

只需要在下面输入
git pull 回车
在命令行输入
wq 保存退出
再次输入
git push origin master
就可以了

GitHub_git push出现[rejected] master -> master (non-fast-forward)问题解决

首先要会打开git的命令行:

1、执行 git pull origin master –allow-unrelated-histories

2、重新add和commit相应文件

3、执行 git push origin master

此时就能够上传成功了

解决方案:

(1).使用强制push的方法:
$ git push -u origin master -f
这样会使远程修改丢失,一般是不可取的,尤其是多人协作开发的时候。
(2).push前先将远程repository修改pull下来
$ git pull origin master
$ git push -u origin master
(3).若不想merge远程和本地修改,可以先创建新的分支:
$ git branch [name]
然后push
$ git push -u origin [name]


使用git分支保存hexo博客源码到github
http://aiyoja.github.io/20220629/
作者
弶森
发布于
2022年6月29日
许可协议