hexo部落格同步管理及遷移

nikolausliu發表於2017-09-28

本文首發於我的個人部落格nikolausliu.top

最近在把公司電腦裡的東西遷移到筆記本里的時候遇到了很多麻煩,hexo部落格怎麼遷移到新電腦中以及怎麼在多端同步hexo部落格就是其中之一。本文參考了知乎中的高票答案,把過程重新梳理了一遍,並在一些關鍵的地方做了更詳細的闡述,自認為更好理解一點。

從分析目錄結構開始

首先,需要了解一下hexo專案的目錄結構,以及各資料夾用來存放哪些檔案(已經瞭解的可以跳過)。下面是我本地hexo專案的目錄結構。資料夾沒有展開,為了和檔案區別,我在資料夾名後加了一個/用以和檔名區分開來。

HEXO
├──.deploy_git/
├──node_modules/
├──public/
├──scaffolds/
├──source/
├──themes/
├──_config.yml
├──.gitignore
├──db.json
├──debug.log
└──package.json複製程式碼

先說public/資料夾和.deploy_git資料夾,這兩個資料夾裡的內容是一樣的。用來存放由markdown檔案(文章)生成的所有靜態檔案,猜測.deploy_git資料夾裡的內容就是在執行hexo g -d命令時唯一會部署到github倉庫username.github.io的內容(這裡沒有求證過,從命名來看應該是這樣,如有謬誤還請指正)。換句話說,github pages託管的只是由hexo生成的靜態檔案,hexo的環境檔案是隻保留在本地的,而這也正是想要在另一臺電腦上重新部署和保持同步hexo部落格需要折騰一番的原因。

剛才提到一個環境檔案的概念,這個不是什麼官方提供的術語,只是我想要區分public/資料夾裡的靜態檔案臨時想的一個詞,可能不是很準確,但是接下來我將沿用這兩個概念(囧)。那麼環境檔案裡我們需要關注的幾個比較重要的檔案分別是:

  • source/資料夾:所有釋出的文章的md檔案都放在這兒
  • themes/資料夾:主題的相關配置檔案以及樣式的修改等都在這兒
  • .gitignore:git提交時將會忽略的項

.gitignore檔案的內容如下:

.DS_Store
Thumbs.db
db.json
*.log
node_modules/
public/
.deploy*/複製程式碼

其實從這也可以看出hexo的本意也是讓我們可以把環境檔案放在github上託管的,並且幫我們列好了忽略的項,比如public/.deploy_git資料夾都是被忽略的,是不會被提交的。這樣,我們在hexo g -d時部署到github上的只有靜態檔案,而提交環境檔案時則不會把靜態檔案也提交,節省了空間。

怎麼把環境檔案託管到github

現在,我們弄清楚了只要把環境檔案也託管到github並且和靜態檔案的託管互不影響就行了,問題是,怎麼做?

在hexo專案跟目錄下執行命令git status,會得到fatal: Not a git repository (or any of the parent directories): .git的提示:當前專案不是一個git倉庫。我之前以為既然靜態檔案可以被提交到github,那hexo專案肯定是一個git倉庫,原來不是,靜態檔案能被推送到遠端倉庫hexo引擎在背後是怎麼實現的我不知道,也不在本文的討論範圍內。目前要緊的是把當前專案跟一個遠端倉庫關聯起來,好管理環境檔案。

那麼,難道要新建一個倉庫來存放環境檔案嘛?不,那樣當然也行,但是還要單獨佔一個倉庫,總感覺不舒服。其實我們可以用分支來管理。

username.github.io倉庫中,目前預設的分支是master,用來存放靜態檔案。我們新建一個分支hexo,並設為預設分支,用來存放環境檔案。



這裡是比較關鍵的一步了,hexo分支是基於master分支的,它在建立時被賦予了與master分支同樣的內容--靜態檔案。做乜啊,hexo分支不是要存放環境檔案的嗎?我當時就是在這裡比較暈,因為知乎的高票答案在這裡說的並不是很清楚。其實現在目的很清晰:我們希望hexo分支是空的,並把我們本地的hexo專案與hexo分支關聯起來,好把環境檔案推送過去。要達到這個目的,要分以下幾步走:

  • github上切換到hexo分支,git clone倉庫到本地。
  • 此時本地會多出一個username.github.io資料夾,命令列cd進去,刪除除.git資料夾(如果你看不到這個資料夾,說明是隱藏了。windows下需要右擊資料夾內空白處,點選'顯示/隱藏 異常檔案',Mac下我就不知道了)外的其他資料夾。
  • 命令列git add -A把工作區的變化(包括已刪除的檔案)提交到暫存區(ps:git add .提交的變化不包括已刪除的檔案)。
  • 命令列git commint -m "some description"提交。
  • 命令列git push origin hexo推送到遠端hexo分支。此時刷下github,如果正常操作,hexo分支應該已經被清空了。
  • 複製本地username.github.io資料夾中的.git資料夾到hexo專案根目錄下。此時,hexo專案已經變成了和遠端hexo分支關聯的本地倉庫了。而username.github.io資料夾的使命到此為止,你可以把它刪掉,因為我們只是把它作為一個“中轉站”的角色。以後每次釋出新文章或修改網站樣式檔案時,git add . & git commit -m "some description" & git push origin hexo即可把環境檔案推送到hexo分支。然後再hexo g -d釋出網站並推送靜態檔案到master分支。

至此,hexo的環境檔案已經全部託管在github的hexo分支了。

新電腦中的環境搭建

這部分應該要簡單一點,如果你已經搭建過一個hexo部落格的話。

  • 新電腦上安裝node.js和git。不贅述。git相關教程推薦廖雪峰老師的git教程,突然想到最近很火的考研神嘴張雪峰老師是什麼鬼,哈哈哈。
  • 安裝hexo:npm install -g hexo-cli
  • clone遠端倉庫到本地 git clone git@github.com:username/username.github.io.git
  • 根據packge.json安裝依賴npm install
  • 本地生成網站並開啟部落格伺服器:hexo g & hexo s。如果一切正常,此時開啟瀏覽器輸入http://localhost:4000/已經可以看到部落格正常執行了。

在兩臺電腦上的同步操作

至此,遷移工作已完成,在兩臺電腦之間的同步操作如下:

  • git pull從遠端hexo分支拉取最新的環境檔案到本地,可以理解為svn的更新操作。比如在公司寫了部落格,回家在電腦上也要寫需要先執行這一步操作。
  • 文章寫完,要釋出時,需要先提交環境檔案,再發布文章。按以下順序執行命令:git add .git commit -m "some descrption"git push origin hexohexo g -d

一些坑

有些坑是在上面的工程中會遇到的,但是如果穿插在工程中將會如過程顯得凌亂,所以我單獨拿出來講一下。

新增ssh key

這個坑是在執行git clone之前要解決的。

github提供了兩種git clone的方式:https和ssh。由於https速度慢,且每次都要輸入口令,所以我們一般選擇使用ssh方式,這就需要我們新增ssh key。

  • 命令列進入使用者主目錄,比如在我的電腦下:c:\users\administrator
  • 命令列執行ssh-keygen -t rsa -C "username@example.com"。它會提示你輸入郵箱,輸入完成以後一路回車就行。完成這一步,找到該目錄下的.ssh資料夾,裡面多了兩個檔案:id_rsa和id_rsa.pub分別是你這臺電腦的ssh key的私鑰和公鑰。用文字開啟公鑰檔案,複製裡面的所有內容備用。
  • 登入github後,進入[settings] -> [SSH and GPG keys]。點選[New SSH key],然後title隨便填一個,比如可以是你的電腦名稱,把剛才複製的公鑰內容黏貼到key中,最後點選[Add SHH key]就完成了。
  • 此時git clone就不會再需要你輸入口令了。

新電腦中部落格不顯示內容的問題

我在新電腦中generate g的時候,報錯warn no layout ...,而且開啟本地部落格也是一片空白。網上說是主題的原因,果然我發現新電腦中的next主題資料夾(我使用的next主題)為空,遠端hexo分支中的next主題資料夾也為空。原來是我在搭建部落格開始使用next主題時,next資料夾是從遠端clone過來的。next資料夾中的.git資料夾會導致next資料夾無法被跟蹤。把這個.git資料夾刪除之後重新提交,這時的狀態時Your branch is up-to-date with 'origin/hexo'了,可是讓我費解的是:遠端hexo分支的next資料夾仍然是空的。我對git只會簡單的使用,搜尋一番未果,我索性直接把next主題下的所有檔案複製黏貼到新電腦對應資料夾下作罷。好在主題檔案我也並不常改動。有知道這裡是什麼原因導致的小夥伴還請告知一下,感激。

相關文章