0%

如何迁移这个博客

今天我需要将这个博客从一台电脑迁移到自己的电脑,即以后我就换一台电脑写博客了,之前那台电脑就不再使用了。我搜索了一下怎么解决这个问题,看到很多方法说的都是在 GitHub 上的仓库新建一个分支,然后 pull 到另一台电脑。这个方法我想应该是可行的,但并不完全符合我的要求,我希望今后自己这台电脑就作为主力机器了,之前的电脑上没必要还保留。这样如果前一台电脑还维持着 maser 分支,而现在的电脑却只能使用新的分支,显然是不合适的。

当然我找到了解决办法,符合我需求的,参见这个链接:使用hexo,换了电脑怎么更新博客?

另外我找到一个知乎链接,跟这个是一模一样的,我觉得有可能是抄的:使用hexo,如果换了电脑怎么更新博客? - skycrown的回答 - 知乎

总之我解决了自己的问题,现在做一下大致记录,以便以后还要这样做的时候有个参考。

1. 操作略述

首先需要安装 NodeJS 和 hexo,这点不做赘述。

今天安装的时候困扰了我很久的问题是网络连接问题导致一直安装不成功,直接将梯子设置为全局模式也是不行的,最后的解决办法是除了梯子要开全局,还要设置 npm 使用代理,用如下语句:

1
npm config set proxy="http://127.0.0.1:10809"

注意 http 代理的端口和 socks5 的端口的不一样的,我这里的端口是用 V2ray 服务的端口。

安装完成后直接将原来电脑上的博客文件夹靠过来,并删除一些文件夹和文件,具体删除哪些,直接引用参考博客中的话:

  1. 讨论下哪些文件是必须拷贝的:首先是之前自己修改的文件,像站点配置 _config.ymltheme 文件夹里面的主题,以及 source 里面自己写的博客文件,这些肯定要拷贝的。除此之外,还有三个文件需要有,就是 scaffolds 文件夹(文章的模板)、package.json(说明使用哪些包)和 .gitignore(限定在提交的时候哪些文件可以忽略)。其实,这三个文件不是我们修改的,所以即使丢失了,也没有关系,我们可以建立一个新的文件夹,然后在里面执行hexo init,就会生成这三个文件,我们只需要将它们拷贝过来使用即可。
    总结:_config.ymltheme/source/scaffolds/package.json.gitignore,是需要拷贝的。
  2. 再讨论下哪些文件是不必拷贝的,或者说可以删除的:首先是 .git文件,无论是在站点根目录下,还是主题目录下的 .git 文件,都可以删掉。然后是文件夹 node_modules(在用npm install会重新生成),public(这个在用hexo g时会重新生成),.deploy_git 文件夹(在使用 hexo d 时也会重新生成),db.json文件。其实上面这些文件也就是是.gitignore文件里面记载的可以忽略的内容。
    总结:.git/node_modules/public/.deploy_git/db.json文件需要删除。

补充一点:博客目录下可能会有一个 package-lock.json 文件,有的话也要删除。

在新拷贝的文件夹里,右键选择 git bash,使用 npm install 命令,进行模块安装。
这里不要使用 hexo init 初始化,因为有的文件我们已经拷贝生成过来了,所以不必用 hexo init 去整体初始化,如果不慎在此时用了 hexo init,则站点的配置文件 _config.yml 里面内容会被清空使用默认值,所以这一步一定要慎重,不要用 hexo init

安装必要组件,主要是hexo 部署和站点地图:

1
2
npm install hexo-deployer-git --save
npm install hexo-generator-sitemap --save

以上步骤完成后直接生成部署,就完成迁移了:

1
2
hexo g
hexo d

2. 上传时遇到的问题

今天上传的时候一直传不上去,用梯子也不行,最后解决办法是在博客目录下的 _config.yml(不是主题目录下的)里修改,大约在第 110 行左右:

1
2
3
4
5
6
7
8
# Deployment
## Docs: https://hexo.io/docs/one-command-deployment
deploy:
type: git
repo:
# github: https://github.com/TimeOverflow/timeoverflow.github.io.git
git@github.com:TimeOverflow/timeoverflow.github.io.git
branch: master

原来用的是 https 协议,改成 git 协议就好了。