Hexo博客(03)源码备份及不同电脑上的同步问题
备份博客源码到github分支
1 建立username.github.io项目
方法如前述,建好后里面只有一个README.md文件2 在username.github.io项目上新建hexo_branch远程分支
1 将自己的username.github.io项目克隆下来
本地电脑上,进入要存放项目的目录,例如D:\Files\Git
,Git Bash执行:git clone https://github.com/masikkk/masikkk.github.io
2 创建hexo_branch分支
进入masikkk.github.io文件夹,执行git branch hexo_branch
3 提交新分支到远程仓库
$ git push origin hexo_branch
会提示输入username和密码,注意username为GitHub注册邮箱,密码为GitHub登录密码
3 设置hexo_branch为默认分支
因为只需要手动管理hexo_branch分支,master分支通过hexo d
部署命令来提交。
GitHub页面->username.github.io项目页面->此项目的settings->左侧Branches->Default branch->选择hexo_branch->点击update4 进入username.github.io文件夹安装配置hexo环境
假设本地已安装了git和node.js,方法如前述。
本地进入username.github.io文件夹,依次执行下面命令1 安装hexo
npm install -g hexo-cli
2 初始化hexo
hexo init
问题:执行hexo init后.git文件夹被删掉了,导致username.github.io文件夹不在git版本控制之下了。
处理:不用担心,继续执行完后两个安装指令,安装完后在本目录再次初始化git并关联远程仓库。3 根据
package.json
安装依赖npm install
4 安装Git部署器
npm install hexo-deployer-git --save
5 切换到本地hexo_branch分支
1 git init重新初始化git
由于执行hexo init
后.git文件夹被删,重新初始化git2 git remote add 关联远程仓库
git remote add origin https://github.com/masikkk/masikkk.github.io
3 新建本地分支hexo_branch
git branch hexo_branch
提示错误fatal: Not a valid object name: ‘master’.
因为git init
后还没有commit过,所以还没有真正建立master分支,先在master下git add .
和git commit
一次,再创建分支即可。4 切换到本地分支hexo_branch
git checkout hexo_branch
之后我们对hexo博客配置、内容的修改都在本地hexo_branch分支进行就行了,修改完备份到远程hexo_branch分支,远程master分支靠hexo d
部署命令管理
- 6 备份本地hexo_branch分支到username.github.io项目的hexo_branch远程分支
现在我们在本地hexo_branch分支下!
push到远程hexo_branch分支:git push origin hexo_branch
输入用户名密码后,提示错误:
To https://github.com/masikkk/masikkk.github.io
! [rejected] hexo_branch -> hexo_branch (fetch first)
error: failed to push some refs to 'https://github.com/masikkk/masikkk.github.io'
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
这是因为远程hexo_branch分支中有一个README.md文件没有拉取到本地,我们将其pull下来:git pull origin hexo_branch
本地hexo_branch分支有了README.md文件。
再次push到远程hexo_branch分支:git push origin hexo_branch
成功后,登录GitHub网页,进入username.github.io项目,可以看到默认hexo_branch分支下已经有刚提交过的文件。
至此,hexo初次备份已完成。
在新电脑上恢复博客源码
将自己的博客源码项目克隆下来
本地电脑上,进入要存放项目的目录,例如D:\Files\Git
,执行git clone https://github.com/masikkk/masikkk.github.io
由于hexo_branch为默认分支,clone下来后进入username.github.io文件夹就处于hex_branch分支下。
注意如果是OSChina上的私有仓库,clone时需要输入OSChina的账号和密码。
如果使用子模块来管理主题,需要加入--recursive
参数进行迭代clone:git clone --recursive https://github.com/masikkk/masikkk.github.io
但是这样有一个问题,如果主题子模块是直接通过原作者的Git地址添加的,对主题进行修改后是无法提交到原作者的远程仓库的,所以无法备份对主题的更改,并且clone时还会出现如下错误:
fatal: reference is not a tree: 1e60629d04abea4c92c6fc4960cc87236f206123
Unable to checkout '1e60629d04abea4c92c6fc4960cc87236f206123' in submodule path 'themes/freemind'
原因是我们本地对子模块进行了修改但是并没有推送到子模块的远程仓库,然后在主项目中提交了一个指向那个非公开状态的指针然后推送远程仓库。当在其他地方进行git submodule update或迭代clone时,那个子模块系统会找不到所引用的提交。
解决方法是先fork
原作者的主题项目为自己的项目,再添加为子模块。
进入username.github.io文件夹安装配置hexo环境
假设本地已安装了git和node.js,也已经有了npm环境,方法如前述。
本地进入username.github.io文件夹,依次执行下面命令npm install -g hexo-cli
,安装hexonpm install
,根据package.json
安装依赖,因为 .gitignore
文件中配置了将node_modules/
文件夹忽略,所以之前安装的插件并不会备份到远程Git仓库,但是我们备份了package.json文件,直接使用npm install方法就可以根据dependencies配置安装所有的依赖包。
不需要执行hexo init
指令,因为hexo需要的文件目录我们已经有了,如果执行hexo init
会将已有文件覆盖掉。
每次更新博客后的备份
这里以在Github分支上备份源码为例,如果是在其他Git仓库中备份的源码,请将hexo_branch分支改为对应的分支名。
下面操作都在本地hexo_branch分支下!
当前在上一次push的电脑上
由于我们在上一次push的电脑上,本地hexo_branch分支和远程hexo_branch分支是完全同步的,只需修改后提交。
- 修改博客配置,写新文章。
git add .
,暂存本地hexo_branch分支下所有文件git commit -m "更新日志"
,本地提交git push origin hexo_branch
,推送到远程hexo_branch分支
错误:fatal: empty ident name (for <(null)>) not allowed
错误信息:
masi@DESKTOP-BRTEUCA MINGW64 /d/Files/Git/hexo_backup (master)
$ git commit -m "首次在家里的台式机上提交"
*** Please tell me who you are.
Run
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
to set your account's default identity.
Omit --global to set the identity only in this repository.
fatal: empty ident name (for <(null)>) not allowed
我在一台全新的电脑上clone下来博客源码,修改后commit提示此错误,原因是Git未初始化。
按照提示设置user.email和user.name即可。
当前不在上一次push的电脑上
由于当前不在上一次push的电脑上,本地hexo_branch分支和远程hexo_branch分支不同步,远程hexo_branch分支版本更新,需要先拉取最新内容,再修改、提交。
git pull origin hexo_branch
,拉取远程hexo_branch分支的最新内容到本地hexo_branch分支并merge。为了避免不必要的冲突,最好先拉取更新,再修改博客内容。- 修改博客配置,写新文章。
git add .
,暂存本地hexo_branch分支下所有文件git commit -m "更新日志"
,本地提交git push origin hexo_branch
,推送到远程hexo_branch分支
备份博客源码到开源中国Git
由于博客配置中有些账号信息,不便于备份都public仓库。GitHub上的免费仓库都是public的,使用private仓库要升级为付费账号,可以选择国内的OSChina或Coding。个人比较喜欢OSChina的页面风格,就选择了备份到OSChina。
ssh连接多个远程仓库
参考http://chitanda.me/2015/06/11/tips-for-setup-hexo
1 生成用于OSChina的新的ssh keys
虽然不备份在GitHub了,但不能直接把原来用于GitHub的ssh keys删掉,因为hexo d
部署命令中还要用到,所以我们生成新的ssh keys,用于OSChina Git。$ ssh-keygen -t rsa -C "email@email.com" -f ~/.ssh/oschina_rsa
之后三次回车,不需要输入passphrase口令,会在~/.ssh/
目录下会生成私钥oschina_rsa
和公钥oschina_rsa.pub
2 配置
~/.ssh/config
~/.ssh/config
是用户的ssh配置文件(如果没有新建一个),在其中指定不同host所使用的密钥。
我的~/.ssh/config
配置(不需要代理则不用配ProxyCommand)
Host github.com *.github.com
ProxyCommand connect -H 172.17.18.80:8080 %h %p #设置代理
IdentityFile ~/.ssh/id_rsa
Host git.oschina.net
ProxyCommand connect -H 172.17.18.80:8080 %h %p #设置代理
IdentityFile ~/.ssh/oschina_rsa
3 添加公钥到OSChina网站
在https://git.oschina.net/profile 页面左侧选择SSH公钥,添加一个公钥,将oschina_rsa.pub
文件内容复制进去。4 测试ssh连接是否成功
执行:ssh -T git@git.oschina.net
提示:The authenticity of host 'git.oschina.net (103.21.119.119)' can't be established. ECDSA key fingerprint is SHA256:FQGC9Kn/eye1W8icdBgrQp+KkGYoFgbVr17bmjey0Wc. Are you sure you want to continue connecting (yes/no)?
输入yes,返回:
Warning: Permanently added 'git.oschina.net,103.21.119.119' (ECDSA) to the list of known hosts. Welcome to Git@OSC, masikkk!
表示连接成功。
备份博客源码到OSChina
1 在OSChina中新建项目
hexo_backup
在OSChina中新建项目hexo_backup
,勾选private,不需要.gitignore
文件,不需要Readme
文件,因为这些我们本地项目中都有。2 删除GitHub中username.github.io项目的hexo_branch分支
我们不需要在GitHub中username.github.io项目的hexo_branch分支中备份博客源码了,将其删除。
执行:git push origin --delete hexo_branch
或git push origin :hexo_branch
输入GitHub用户名密码后提示:To https://github.com/masikkk/masikkk.github.io ! [remote rejected] hexo_branch (refusing to delete the current branch: refs/heads/hexo_branch) error: failed to push some refs to 'https://github.com/masikkk/masikkk.github.io'
原因是username.github.io项目中hexo_branch是默认分支,无法删除,解决方法是登录GitHub,修改项目的默认分支为master。
```
$ git push origin –delete hexo_branch
Username for ‘https://github.com': masi.1989@163.com
To https://github.com/masikkk/masikkk.github.io[deleted] hexo_branch
```3 解除项目与GitHub远程仓库的关联
进入本地masikkk.github.io文件夹,执行:git remote rm origin
即删除clone时默认添加的远程仓库origin,现在本地Git已经没有关联的远程仓库了。4 合并后删除本地hexo_branch分支
既然我们不需要在GitHub的masikkk.github.io项目上使用分支来备份源码了,也就没必要在本地维护两个分支了,这样反而麻烦。现在可以将本地hexo_branch分支合并到本地master分支,之后,删除本地hexo_branch分支。
先切回master分支,本地masikkk.github.io文件夹下:
$ git checkout master
error: pathspec 'master' did not match any file(s) known to git.
出错了,查了下,原因是在master分支下没有commit过,也就没有真正建立master分支,所以切换不过去,但我记着之前是有master分支的啊,奇怪。
怎么办呢,想了个笨方法,既然我们本地是项目的最新版,也不与远程关联,直接删除.git
文件夹,使本地项目回到无Git版本控制状态,然后重新git init
初始化Git,再与远程关联。
本地masikkk.github.io文件夹下:
User@TPSL400 MINGW64 /d/Files/Git/masikkk.github.io (hexo_branch)
$ rm -rf .git
然后git init
建立Git版本控制:
$ git init
Initialized empty Git repository in D:/Files/Git/masikkk.github.io/.git/
之后我们的masikkk.github.io
目录被纳入Git版本控制,并处于默认的master分支下。
- 5 关联OSChina中刚才新建的项目hexo_backup
本地masikkk.github.io文件夹下:git remote add origin git@git.oschina.net:masikkk/hexo_backup.git
执行git remote show origin
查看下远程仓库:
```
$ git remote show origin
- remote origin
Fetch URL: git@git.oschina.net:masikkk/hexo_backup.git
Push URL: git@git.oschina.net:masikkk/hexo_backup.git
HEAD branch: (unknown)
```
- 6 备份博客源码到OSChina
本地masikkk.github.io文件夹下,添加、提交、push到远程仓库:
push后提示:git add . git commit -m "首次备份到OSChina" git push origin master
```
Counting objects: 227, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (211/211), done.
Writing objects: 100% (227/227), 1.30 MiB | 0 bytes/s, done.
Total 227 (delta 28), reused 0 (delta 0)
To git@git.oschina.net:masikkk/hexo_backup.git
- [new branch] master -> master
```
说明备份成功,没想到push到OSChina的时候都不需要输入密码的。登录网站后可以看到备份的博客源码。
主题子模块的处理
我是通过Git子模块来管理使用的freemind主题的,上面步骤中有个删除.git
并重新git init
,之后可能失去了子模块关联,没关系,我们重新将freemind主题添加为主项目的子模块。
进入masikkk.github.io/themes/freemind
目录,执行git status
显示:
$ git status
fatal: Not a git repository: ../../.git/modules/themes/freemind
嗯,看来freemind主题都已经失去了自己的Git版本(虽然.git文件夹依然存在),重新clone并添加为主项目的submodule吧。先把主题的_config.yml
配置文件拷出来备份,里面有一些自己的配置,不想重新配了。然后删除整个freemind
目录。
进入masikkk.github.io目录,clone主题到themes/freemind目录并将其添加为本项目的子项目:git submodule add https://github.com/wzpan/hexo-theme-freemind.git themes/freemind
提示:themes/freemind' already exists in the index
原因是刚才我们commit过一次,Git版本库里已经有themes/freemind
目录了,先从Git版本库中将其删除:
删除整个freemind
目录后执行:
git add .
git commit -m "首次备份到OSChina"
然后重新在masikkk.github.io目录中执行:git submodule add https://github.com/wzpan/hexo-theme-freemind.git themes/freemind
放弃使用子模块管理主题
哎,折腾啊,人生在于折腾。
已经放弃使用子模块来管理主题。
使用子模块来管理主题是有问题的,因为我们无法把对主题的修改push到原作者的Git仓库,所以每次push都没有备份在主题文件夹中的修改。
如果是在github上备份的话,可以先把主题fork
为自己的项目,再添加为子模块,之后能随意修改提交对主题的改动。但现在来到OSChina,无法直接fork
github项目,虽然可以先在github上fork
,再在OSChina上导入自己github上的项目,太麻烦了,还是直接删掉主题的.git
文件夹当普通目录管理方便。
想想为什么用子模块来管理主题,还不是为了方便作者更新后直接git pull
拉取更新,但一个成熟的主题也不会经常修改,并且咱都能自己定制了,以后对原版的依赖不大。
移除子模块状态
只是移除子模块管理,并不删除freemind主题。
- 删除
themes/freemind
目录的.git
隐藏文件夹。 - 修改
.gitmodules
文件,去掉freemind子模块,如果只有这一个子模块的话,直接删除.gitmodules
文件 - 修改
.git\config
文件,去掉freemind子模块; - 删除
.git\modules\themes
目录; git rm --cached themes/freemind/
,使freemind目录脱离Git版本控制
之后,备份到OSChina
git add .
git commit -m "不再使用子模块管理freemind主题 "
git push origin master
注意这里有个先使freemind目录脱离版本控制,再git add .
添加回来的过程,否则到OSChina网页查看freemind目录还是一个到github的链接。
参考
GitHub Pages + Hexo搭建博客
http://crazymilk.github.io/2015/12/28/GitHub-Pages-Hexo搭建博客/利用git解决hexo博客多PC间同步问题
http://chitanda.me/2015/06/18/hexo-sync-in-multiple-pc/hexo博客搭建时遇到的一些问题(git多网站ssh部署方案)
http://chitanda.me/2015/06/11/tips-for-setup-hexo
上一篇 2016年第二季度运动记录
下一篇 SSH笔记
页面信息
location:
protocol
: host
: hostname
: origin
: pathname
: href
: document:
referrer
: navigator:
platform
: userAgent
: