起因
- 在
hexo deploy
的时候,只提交public
目录下的文件(这是个错误的认识,下文将解释).但是整个hexo项目的配置文件等关键文件还留在本地, 若网站发生一些错误配置,但没有记录配置的过程,造成的后果是不可逆的,于是要备份整个仓库 - 原本的思路是,在hexo的根目录下
git init
,将根目录设置为一个git项目,在每次deploy的时候执行git push,项目就被保存在了另一个仓库,项目确实被保存在了另一个仓库,但是却没有发现这个仓库里少了一写东西 - 在本地测试发布一篇博客的时候,报告错误,在此之前,修改了很多设置,于是想到回退整个仓库,并从远程clone之,当回退到确信没有错误的仓库时,还是报错,于是将问题放到新写的markdown文件上,发现修改了一下格式后,就能正确本地测试,也就是说,解决了最开始的问题.
- 但是出现了另一个问题,在将博客推送到服务器的时候,报告缺少
.git
文件,根据网上论坛提示进行hexo init
.(这是错误的,下文解释),在执行完hexo init后(其实没有执行完,中途报错退出了,因为已经存在hexo项目),后果就是这个命令导致缺少一系列配置文件,并缺少了deploy的必要模块,于是重新安装模块… - 再次把仓库回退到正确的版本,并创建一篇格式正确的markdown(格式问题是,设置自动识别代码语言造成的,应关闭该功能),本地测试通过,提交成功(意不意外,惊不惊喜,同样的流程为什么上一步会出现这么复杂的错误的,可能是我改了其他配置吧),但是本应提交网站的仓库,提交了和备份相同的内容,意识到一定是某个配置文件出错,但是正确的仓库版本不应该出现错误的配置文件,
- 于是查看模块代码,在deploy有关模块中看到,会先提交.deploy_git里面的内容,如果该目录不存在,则创建之,否则会调用hexo目录下的
.git
,凑巧我的项目根目录下有这个文件,于是提交了整个项目,问题渐渐清晰 - 但是项目根目录下有
.deploy_git
目录,但这个目录是空的 - 于是拿一个新的hexo项目进行测试,从0开始到发布博客走一遍,看到新的hexo的
.deploy_git
项目下有文件,而且是网站的发布文件,这才发现了最开始的错误认识,网站并不是发布的public
而是.deploy_git
.这个目录是一个仓库 - 于是直接clone网站仓库,将这个仓库改名为
.deploy_git
,网站又正常提交了.但是注意到,提交后的备份代码.deploy_git
目录还是为空 - 经过一翻搜索,了解到了git 子模块(submodule)的概念,并理解相关操作,很明显
.deploy_git
就是整个项目的子模块,成为子模块的原因是我在根目录执行了git init
- 查询到在项目中添加子模块的方法,
.deploy_git
模块确确实实已经存在,而且是hexo自动创建,我不能用创建新子模块的方法把这个模块设置为子模块,方法中也提到,创建完成子模块会多一个配置文件,我在本地添加这个配置文件,提交到仓库,无果 - 直接在github网站上添加配置文件,然后pull,配置文件就被同步到了本地
- 重新clone网站,按照子模块的操作步骤,可以将整个网站(包括.deploy_git)备份下来
- 问题解决
操作
- 准备
- 在本地仓库根目录
git init
,目的是添加.git
目录.push 本地仓库 - 手动在远程备份仓库添加.gitmodules
- pull备份仓库
- 在本地仓库根目录
- 正常发布
hexo clean
hexo generate
hexo deploy
git add -f *
git commit -m "备份"
git push origin master
恢复
- git clone git@github.com:RigeI/blog.git
- git submodule init
- git submodule update
注:不能使用
git clone git@github.com:RigeI/blog.git --recursive
进行恢复
结束语
- 上面提到的任何不懂的信息请自行百度,完全了解后再对网站源码进行修改,否则会进一步扩大对网站和备份的破坏