当前位置: 首页 > news >正文

hexo博客同步管理及迁移

本文首发于我的个人博客nikolausliu.top

最近在把公司电脑里的东西迁移到笔记本里的时候遇到了很多麻烦,hexo博客怎么迁移到新电脑中以及怎么在多端同步hexo博客就是其中之一。本文参考了知乎中的高票答案,把过程重新梳理了一遍,并在一些关键的地方做了更详细的阐述,自认为更好理解一点。

从分析目录结构开始

首先,需要了解一下hexo项目的目录结构,以及各文件夹用来存放哪些文件(已经了解的可以跳过)。下面是我本地hexo项目的目录结构。文件夹没有展开,为了和文件区别,我在文件夹名后加了一个/用以和文件名区分开来。

HEXO
├──.deploy_git/
├──node_modules/
├──public/
├──scaffolds/
├──source/
├──themes/
├──_config.yml
├──.gitignore
├──db.json
├──debug.log
└──package.json复制代码

先说public/文件夹和.deploy_git文件夹,这两个文件夹里的内容是一样的。用来存放由markdown文件(文章)生成的所有静态文件,猜测.deploy_git文件夹里的内容就是在执行hexo g -d命令时唯一会部署到github仓库username.github.io的内容(这里没有求证过,从命名来看应该是这样,如有谬误还请指正)。换句话说,github pages托管的只是由hexo生成的静态文件,hexo的环境文件是只保留在本地的,而这也正是想要在另一台电脑上重新部署和保持同步hexo博客需要折腾一番的原因。

刚才提到一个环境文件的概念,这个不是什么官方提供的术语,只是我想要区分public/文件夹里的静态文件临时想的一个词,可能不是很准确,但是接下来我将沿用这两个概念(囧)。那么环境文件里我们需要关注的几个比较重要的文件分别是:

  • source/文件夹:所有发布的文章的md文件都放在这儿
  • themes/文件夹:主题的相关配置文件以及样式的修改等都在这儿
  • .gitignore:git提交时将会忽略的项

.gitignore文件的内容如下:

.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/复制代码

其实从这也可以看出hexo的本意也是让我们可以把环境文件放在github上托管的,并且帮我们列好了忽略的项,比如public/.deploy_git文件夹都是被忽略的,是不会被提交的。这样,我们在hexo g -d时部署到github上的只有静态文件,而提交环境文件时则不会把静态文件也提交,节省了空间。

怎么把环境文件托管到github

现在,我们弄清楚了只要把环境文件也托管到github并且和静态文件的托管互不影响就行了,问题是,怎么做?

在hexo项目跟目录下执行命令git status,会得到fatal: Not a git repository (or any of the parent directories): .git的提示:当前项目不是一个git仓库。我之前以为既然静态文件可以被提交到github,那hexo项目肯定是一个git仓库,原来不是,静态文件能被推送到远程仓库hexo引擎在背后是怎么实现的我不知道,也不在本文的讨论范围内。目前要紧的是把当前项目跟一个远程仓库关联起来,好管理环境文件。

那么,难道要新建一个仓库来存放环境文件嘛?不,那样当然也行,但是还要单独占一个仓库,总感觉不舒服。其实我们可以用分支来管理。

username.github.io仓库中,目前默认的分支是master,用来存放静态文件。我们新建一个分支hexo,并设为默认分支,用来存放环境文件。



这里是比较关键的一步了,hexo分支是基于master分支的,它在创建时被赋予了与master分支同样的内容--静态文件。做乜啊,hexo分支不是要存放环境文件的吗?我当时就是在这里比较晕,因为知乎的高票答案在这里说的并不是很清楚。其实现在目的很清晰:我们希望hexo分支是空的,并把我们本地的hexo项目与hexo分支关联起来,好把环境文件推送过去。要达到这个目的,要分以下几步走:

  • github上切换到hexo分支,git clone仓库到本地。
  • 此时本地会多出一个username.github.io文件夹,命令行cd进去,删除除.git文件夹(如果你看不到这个文件夹,说明是隐藏了。windows下需要右击文件夹内空白处,点选'显示/隐藏 异常文件',Mac下我就不知道了)外的其他文件夹。
  • 命令行git add -A把工作区的变化(包括已删除的文件)提交到暂存区(ps:git add .提交的变化不包括已删除的文件)。
  • 命令行git commint -m "some description"提交。
  • 命令行git push origin hexo推送到远程hexo分支。此时刷下github,如果正常操作,hexo分支应该已经被清空了。
  • 复制本地username.github.io文件夹中的.git文件夹到hexo项目根目录下。此时,hexo项目已经变成了和远程hexo分支关联的本地仓库了。而username.github.io文件夹的使命到此为止,你可以把它删掉,因为我们只是把它作为一个“中转站”的角色。以后每次发布新文章或修改网站样式文件时,git add . & git commit -m "some description" & git push origin hexo即可把环境文件推送到hexo分支。然后再hexo g -d发布网站并推送静态文件到master分支。

至此,hexo的环境文件已经全部托管在github的hexo分支了。

新电脑中的环境搭建

这部分应该要简单一点,如果你已经搭建过一个hexo博客的话。

  • 新电脑上安装node.js和git。不赘述。git相关教程推荐廖雪峰老师的git教程,突然想到最近很火的考研神嘴张雪峰老师是什么鬼,哈哈哈。
  • 安装hexo:npm install -g hexo-cli
  • clone远程仓库到本地 git clone git@github.com:username/username.github.io.git
  • 根据packge.json安装依赖npm install
  • 本地生成网站并开启博客服务器:hexo g & hexo s。如果一切正常,此时打开浏览器输入http://localhost:4000/已经可以看到博客正常运行了。

在两台电脑上的同步操作

至此,迁移工作已完成,在两台电脑之间的同步操作如下:

  • git pull从远程hexo分支拉取最新的环境文件到本地,可以理解为svn的更新操作。比如在公司写了博客,回家在电脑上也要写需要先执行这一步操作。
  • 文章写完,要发布时,需要先提交环境文件,再发布文章。按以下顺序执行命令:git add .git commit -m "some descrption"git push origin hexohexo g -d

一些坑

有些坑是在上面的工程中会遇到的,但是如果穿插在工程中将会如过程显得凌乱,所以我单独拿出来讲一下。

添加ssh key

这个坑是在执行git clone之前要解决的。

github提供了两种git clone的方式:https和ssh。由于https速度慢,且每次都要输入口令,所以我们一般选择使用ssh方式,这就需要我们添加ssh key。

  • 命令行进入用户主目录,比如在我的电脑下:c:\users\administrator
  • 命令行运行ssh-keygen -t rsa -C "username@example.com"。它会提示你输入邮箱,输入完成以后一路回车就行。完成这一步,找到该目录下的.ssh文件夹,里面多了两个文件:id_rsa和id_rsa.pub分别是你这台电脑的ssh key的私钥和公钥。用文本打开公钥文件,复制里面的所有内容备用。
  • 登录github后,进入[settings] -> [SSH and GPG keys]。点击[New SSH key],然后title随便填一个,比如可以是你的电脑名称,把刚才复制的公钥内容黏贴到key中,最后点击[Add SHH key]就完成了。
  • 此时git clone就不会再需要你输入口令了。

新电脑中博客不显示内容的问题

我在新电脑中generate g的时候,报错warn no layout ...,而且打开本地博客也是一片空白。网上说是主题的原因,果然我发现新电脑中的next主题文件夹(我使用的next主题)为空,远程hexo分支中的next主题文件夹也为空。原来是我在搭建博客开始使用next主题时,next文件夹是从远程clone过来的。next文件夹中的.git文件夹会导致next文件夹无法被跟踪。把这个.git文件夹删除之后重新提交,这时的状态时Your branch is up-to-date with 'origin/hexo'了,可是让我费解的是:远程hexo分支的next文件夹仍然是空的。我对git只会简单的使用,搜索一番未果,我索性直接把next主题下的所有文件复制黏贴到新电脑对应文件夹下作罢。好在主题文件我也并不常改动。有知道这里是什么原因导致的小伙伴还请告知一下,感激。

转载于:https://juejin.im/post/59ccb2fc5188257462038e17

相关文章:

  • WM_MOUSEWHEEL、WM_LBUTTONDOWN等父子窗口消息传递陷阱
  • 使用IntelliJ IDEA 配置Maven(入门)
  • 软件项目中的成本构成及估算方法【转】
  • windows下node配置npm全局路径(踩坑)
  • springmvc入门程序
  • SQServer查询数据库所有触发器
  • 流水线生产,精益生产,TPS和TOC的缓冲管理
  • win32——关机
  • 几个常用线程的
  • 可重入函数与不可重入函数
  • C#关于MSMQ通过HTTP远程发送专有队列消息的问题
  • python操作redis
  • Poisson Blending(Seamless clone)研究和实现
  • 【div】给div添加滚动条
  • DockOne微信分享( 九十四):唯品会基于Kubernetes的网络方案演进
  • 【每日笔记】【Go学习笔记】2019-01-10 codis proxy处理流程
  • eclipse的离线汉化
  • es6要点
  • Git同步原始仓库到Fork仓库中
  • JS数组方法汇总
  • npx命令介绍
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 面试遇到的一些题
  • 使用SAX解析XML
  • 首页查询功能的一次实现过程
  • #HarmonyOS:基础语法
  • $.proxy和$.extend
  • (6)添加vue-cookie
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (八)Flask之app.route装饰器函数的参数
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (四)鸿鹄云架构一服务注册中心
  • (转载)利用webkit抓取动态网页和链接
  • ****** 二 ******、软设笔记【数据结构】-KMP算法、树、二叉树
  • *上位机的定义
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .net core webapi 大文件上传到wwwroot文件夹
  • .Net Web项目创建比较不错的参考文章
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...
  • ::before和::after 常见的用法
  • ??在JSP中,java和JavaScript如何交互?
  • @EnableConfigurationProperties注解使用
  • [20161101]rman备份与数据文件变化7.txt
  • [Arduino学习] ESP8266读取DHT11数字温湿度传感器数据
  • [AutoSar]状态管理(五)Dcm与BswM、EcuM的复位实现
  • [BZOJ5125]小Q的书架(决策单调性+分治DP+树状数组)
  • [codevs 1288] 埃及分数 [IDdfs 迭代加深搜索 ]
  • [codevs] 1029 遍历问题
  • [Fri 26 Jun 2015 ~ Thu 2 Jul 2015] Deep Learning in arxiv
  • [Grafana]ES数据源Alert告警发送
  • [Java][Liferay] File system in liferay
  • [JS]Math.random()随机数的二三事