利用git解決hexo博客多PC間同步問題

聲明

本文只是給相似我這樣的git新人作參考,對git比較熟悉的話能夠無視了。因爲自身對git的瞭解就不是特別深,因此可能有些地方會有錯誤,歡迎各位指正。(本文有在微博上接受geekrainy的幫助,對此表示謝意)
ps:建議git相關操做都在bash上進行操做。不依賴windows下guigit

場景

單位和家裏兩PC,同時都想更新blog。而因爲hexo沒有後臺,並且所有文件都在本地生成,因此若是公司電腦上發表了A文章後回家又寫了篇B文章,在家裏上傳後你會發現只有B文章而A文章沒了(由於家裏的PC上沒有A文章的md文件),因此多臺電腦同時用來寫文章的時候,須要解決備份問題。
<!-- more -->
而經常使用的備份方案無非兩種:github

百度雲,Dropbox等網盤雲備份

(不清楚Dropbox,僅以百度云爲例)
優勢:免費且操做簡單
不足:shell

  1. 備份後同步比較麻煩,每次另外一臺電腦上都須要手動下載備份文件夾手動覆蓋。json

  2. 開啓雲端自動備份的時候,寫blog的過程當中若是保存了文件,會觸發百度雲的上傳,而上傳過程當中產生的xxx.cfg文件會讓hexo解析失敗,致使hexo s生成的本地服務器進程中止,不方便邊寫邊預覽windows

所以此方案做廢緩存

利用第三方的git服務備份

優勢:部署完成後更新方便,hexo 更新完後只須要再更新全站到git便可
缺點:部署過程相對比較麻煩,對新手不友好(實際上是因爲對git的理解不深致使的)
國內外如今知名的git服務提供商主要有:
github、gitcafe、bitbucket、oschina、coding等bash

因爲blog文件夾裏有些插件配置文件會涉及比較敏感的隱私數據(雲服務商的appsecret key之類的),因此建議放私有倉庫(固然也能夠把配置文件單獨拿出來而後其他的所有扔到git的公衆倉庫,這個看人,本文重點也不在於git服務商的選擇或者公有私有庫之爭)
上面說起的5家服務商裏,githubgitcafe的私有庫是收費的,而另外三家的私有庫目前免費。各位能夠自行選擇,我我的選擇了oschina服務器

配置過程

git多網站多帳戶部署過程能夠參考git多網站ssh部署方案hexo

上傳blog到git

這個操做建議在blog進度最新的PC上進行的,不然後面解決衝突會比較麻煩
在osc上添加公鑰,創建新respo等過程略過不講。app

  1. 刪除文件夾內原有的.git緩存文件夾並編輯.gitignore文件

  • 有些插件或者主題是git上下過來安裝的話,每一個文件夾下都會有對應的.git 文件夾,記得先刪掉,不然會和blog倉庫衝突
    .git默認是隱藏文件夾,須要先開啓顯示隱藏文件夾。##.git文件夾被刪除後整個文件對應的git倉庫狀態也會被清空##)


  • .gitignore文件做用是聲明不被git記錄的文件,blog根目錄下的.gitignore是hexo初始化帶來的,能夠先刪除或者直接編輯,對hexo不會有影響。建議.gitignore內添加如下內容:

    /.deploy_git
    /public  
    /_config.yml
    1. .deploy_git是hexo默認的.git配置文件夾,不須要同步

    2. public內文件是根據source文件夾內容自動生成,不須要備份,否則每次改動內容太多

    3. 即便是私有倉庫,除去在線服務商員工能夠看到的風險外,還有云服務商被攻擊形成泄漏等可能,因此不建議將配置文件傳上去

  1. 初始化倉庫
    blog根目錄下執行如下代碼:

git init
git remote add origin <server>

<server>是指在線倉庫的地址。origin是本地分支,remote add操做會將本地倉庫映射到雲端

  1. 添加本地文件到倉庫並同步到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 <server> #將本地文件和雲端倉庫映射起來。這步不能夠跳過
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 <file>..." 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代理爲例說下配置過程:

  1. 打開~/.ssh/config文件。

  2. Host github *.github.com下添加如下字段:

    Proxycommand ssh -S 127.0.0.1:1080 %h %p
  3. 測試鏈接

保存退出後重啓git bash。
輸入ssh -vT git@github.com,當返回Hi username! You've successfully authenticated, but GitHub does not provide shell access.的時候即說明配置成功以後github的全部流量都會走本地的ss代理。

相關文章
相關標籤/搜索