--- title: 利用git解决hexo博客多PC间同步问题 date: 2016-08-11 10:57:47 tags: [hexo,git,同步] permalink: hexo-sync-in-multiple-pc description: 本文只是给类似我这样的git新人做参考,对git比较熟悉的话可以无视了。由于自身对git的了解就不是特别深,所以可能有些地方会有错误,欢迎各位指正。ps:建议git相关操作都在bash上进行操作。不依赖windows下gui。 --- ## 场景 单位和家里两PC,同时都想更新blog。而由于hexo没有后台,而且全部文件都在本地生成,所以如果公司电脑上发表了A文章后回家又写了篇B文章,在家里上传后你会发现只有B文章而A文章没了(因为家里的PC上没有A文章的md文件),所以多台电脑同时用来写文章的时候,需要解决备份问题。 而常用的备份方案无非两种: ### 百度云,Dropbox等网盘云备份 (不清楚Dropbox,仅以百度云为例) 优点:免费且操作简单 不足:备份后同步比较麻烦,每次另一台电脑上都需要手动下载备份文件夹手动覆盖。 开启云端自动备份的时候,写blog的过程中如果保存了文件,会触发百度云的上传,而上传过程中产生的xxx.cfg文件会让hexo解析失败,导致hexo s生成的本地服务器进程停止,不方便边写边预览 因此此方案作废。 ### 利用第三方的git服务备份 优点:部署完成后更新方便,hexo 更新完后只需要再更新全站到git即可 缺点:部署过程相对比较麻烦,对新手不友好(其实是由于对git的理解不深导致的) ### 国内外现在知名的git服务提供商主要有: [github](https://github.com/)、[gitcafe](https://coding.net/gitcafe.html)、[bitbucket](https://bitbucket.org/)、[oschina](http://www.oschina.net/)、[coding](https://coding.net/)等,不过gitcafe好像跟coding合并了。 由于blog文件夹里有些插件配置文件会涉及比较敏感的隐私数据(云服务商的appsecret key之类的),所以建议放私有仓库(当然也可以把配置文件单独拿出来然后其余的全部扔到git的公众仓库,这个看人,本文重点也不在于git服务商的选择或者公有私有库之争) 上面提及的5家服务商里,[github](https://github.com/)、[gitcafe](https://coding.net/gitcafe.html)的私有库是收费的,而另外三家的私有库目前免费。各位可以自行选择,我个人选择了[oschina](http://www.oschina.net/),免费嘛,谁都喜欢! ## 配置过程 git多网站多账户部署过程可以参考[git多网站ssh部署方案](https://sunkejava.github.io/git-hexo-setuo-error) ## 上传blog到git 这个操作建议在blog进度最新的PC上进行的,否则后面解决冲突会比较麻烦 在osc上添加公钥,建立新respo等过程略过不讲。 删除文件夹内原有的.git缓存文件夹并编辑.gitignore文件 有些插件或者主题是git上下过来安装的话,每个文件夹下都会有对应的.git 文件夹,记得先删掉,否则会和blog仓库冲突 (.git默认是隐藏文件夹,需要先开启显示隐藏文件夹。 .git文件夹被删除后整个文件对应的git仓库状态也会被清空) .gitignore文件作用是声明不被git记录的文件,blog根目录下的.gitignore是hexo初始化带来的,可以先删除或者直接编辑,对hexo不会有影响。建议.gitignore内添加以下内容:

/.deploy_git
/public
/_config.yml
.deploy_git是hexo默认的.git配置文件夹,不需要同步 public内文件是根据source文件夹内容自动生成,不需要备份,不然每次改动内容太多 即使是私有仓库,除去在线服务商员工可以看到的风险外,还有云服务商被攻击造成泄漏等可能,所以不建议将配置文件传上去 ### 初始化仓库 blog根目录下执行以下代码:

git init
git remote add origin 
是指在线仓库的地址。origin是本地分支,remote add操作会将本地仓库映射到云端 ### 添加本地文件到仓库并同步到git上

git add .  #添加blog目录下所有文件,注意有个.(.gitignore声明过的文件不包含在内)
git commit -m "first commit" #添加更新说明
git push -u origin master #推送更新到云端服务器
在执行这步之前一定要注意检查下.gitignore文件的内容,看看是否正确的把一些文件夹忽略掉了。如果加错了的话可以用

git rm -r --cached #撤销添加操作 
到这里的时候,云端备份已经完成 ## 将git的内容同步到本地 假设之前将A电脑里的内容备份到git了,现在B电脑准备同步内容。

git init
git remote add origin  #将本地文件和云端仓库映射起来
git fetch --all
git reset --hard origin/master
fetch是将云端所有内容拉取下来。reset则是不做任何合并处理,强制将本地内容指向刚刚同步下来的云端内容(正常pull的话需要考虑不少冲突的问题,比较麻烦。) ## 更新文章后的同步操作 假设在B电脑上写完了文章,也hexo d -g发布完了,这时候需要将新文章的md文件更新上去。(其实就是提交更新给git,会的可以无视了) 同一个bash界面下:

git add .
这时候可以用git status查看状态,一般会显示刚刚更改过的文件状态。如:

On branch master
Changes to be committed:
  (use "git reset HEAD ..." to unstage)

        modified:   db.json
        new file:   source/_posts/test.md
上面的输出状态即说明’db.json’文件做了更改,source/_posts目录下新增了’test.md’文件。 然后对更改添加说明并推送到远程仓库.

git commit -m '更新信息'
git push
当显示类似如下提示的时候,即表示备份成功

To git@git.oschina.net:xxxx/blog-backup.git
 + 2c77e1e...5616bc6 master -> master (forced update)
再到A电脑上的时候,只需要

git pull
即可同步更新 ## 给git配置sock5代理 由于某些众所周知的缘故,所以github时不时的有时候速度会很慢,这种情况下本地代理就派上用场了。 这里以给git的SSH传输方式配置本地SS代理为例说下配置过程: 打开~/.ssh/config文件。 在Host github *.github.com下添加以下字段: Proxycommand ssh -S 127.0.0.1:1080 %h %p #### 测试连接 保存退出后重启git bash。 输入ssh -vT git@github.com,当返回Hi username! You've successfully authenticated, but GitHub does not provide shell access.的时候即说明配置成功 之后github的所有流量都会走本地的ss代理。 > 有什么留言或问题直接在文末留下评论即可。 欢迎访客: