hexo
中有着豐富的主題能夠選擇, 大部分的使用示例或者教程都是將主題 clone 到 theme 文件夾中來使用. 但這樣來使用主題會存在以下的問題:git
.git
項目文件夾, 提交 hexo 項目時默認不會提交 theme 的 .git
文件夾, 在其餘電腦上 clone 後會失去 theme 本來的版本控制功能.還好萬能的 Git 針對這種問題已經有了成熟的解決方案, 經過自帶的 Git submodules 功能便可優雅的避免以上的問題.程序員
Git submodules 稱之爲 Git 子模塊. 子模塊容許你將一個 Git 倉庫做爲另外一個 Git 倉庫的子目錄. 它可讓你將另外一個倉庫克隆到本身的項目中, 同時還保持提交的獨立. 它很是適合咱們程序員在項目管理時遇到的一種狀況: 某個工做中的項目須要包含並使用另外一個項目. 這些包含的項目也許是第三方庫, 或者你獨立開發的, 用於多個父項目的庫. 你想要把它們當作兩個獨立的項目, 同時又想在一個項目中使用另外一個.github
在 hexo 中使用豐富的第三方主題的狀況正很是符合這種情景.npm
瞭解了 Git submodles 的使用場景後, 這麼強力的工具如何在 hexo 中來使用呢. 在這裏演示下個人用法.瀏覽器
首先初始化一個用來演示的 hexo 項目:bash
npm install hexo-cli -g
hexo init blog
cd blog
npm install
hexo server
複製代碼
執行以上操做後, 打開瀏覽器進入 http://localhost:4000/ 即可以預覽到初始化好的 hexo 頁面. 在項目的 theme
文件夾中能夠看到使用了默認的 landscape
主題. 在這個 hexo 項目中創建起 Git 版本管理.服務器
git init
git commit -m 'initial project'
複製代碼
如今一個 hexo 本地倉庫已經創建好了並將初始化的文件提交了進去.hexo
如今咱們使用 Git submodules 的方式來選擇一個第三方主題來替換本來的 landscape
主題. 這裏選擇我比較喜歡的的 pure 主題.編輯器
git submodule add https://github.com/cofess/hexo-theme-pure themes/pure
複製代碼
git 便會將 hexo-theme-pure
主題做爲一個項目子模塊 clone 到 themes/pure 中. 同時 hexo 項目中會自動生成一個 .gitmodules
文件, 這個配置文件中保存了項目 URL 與已經拉取的本地目錄之間的映射.工具
.gitmodules 文件內容
$ cat .gitmodules
[submodule "themes/pure"]
path = themes/pure
url = https://github.com/cofess/hexo-theme-pure
複製代碼
git 目前狀態
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: .gitmodules
new file: themes/pure
複製代碼
能夠看到, 雖然 themes/pure 是工做目錄中的一個子目錄, 但 Git 仍是會將它視做一個子模塊. 當不在那個目錄中時, Git 並不會跟蹤它的內容, 而是將它看做該倉庫中的一個特殊提交.
主題 clone 好後, 按照主題的說明安裝好須要的插件模塊, 再執行 hexo s
, 從新打開 http://localhost:4000/ 即可以看到使用新主題的博客頁面了.
提交新的 git 記錄
$ rm -rf themes/landscape
$ git commit -am 'added pure themes'
create mode 100644 .gitmodules
create mode 160000 themes/pure
複製代碼
刪除舊的 landscape
主題, 使用 git commit -am
從新提交添加了 pure
主題的 hexo 項目, 能夠看到 git 使用 160000 模式建立 themes/pure 記錄. 這是 git 中的一種特殊模式, 它本質上意味着將一次提交記做一項目錄記錄, 而非將它記錄成一個子目錄或者一個文件.
拉取含子模塊的修改
主題做爲子模塊添加到項目中後, 若主題做者有更新, 即可經過兩種方法來拉取主題的更新內容.
themes
下主題目錄, 執行 git fetch
和 git merge origin/master
來 merge 上游分支的修改git submodule update --remote
, Git 將會自動進入子模塊而後抓取並更新更新後從新提交一遍, 子模塊新的跟蹤信息便也會記錄到倉庫中.
拉取含子模塊的項目
使用 git clone
命令默認不會拉取項目中的子模塊, 在 clone 後的項目中能夠經過運行兩個命令:
git submodule init
初始化本地配置文件git submodule update
從該項目中抓取全部數據並檢出父項目中列出的合適的提交也可在 clone 使用 git clone --recursive
命令, git 就會自動初始化並更新倉庫中的每個子模塊.
經過子模塊基礎用法, 能夠直接方便的跟蹤管理一些的簡單的主題. 但不少主題都存在一些本身的配置項目, 須要咱們根據本身的須要來進行設置, 或者咱們想要在主題的基礎上自定義修改本身喜歡的主題, 這個時候就須要對主題進行修改並提交倉庫以便在各處使用.
不過對於主題倉庫咱們通常沒有提交的權限, 不能提交到主題源倉庫中. 此時能夠經過 fork
功能, 在源主題上 fork 出本身項目, 從而在本身倉庫中進行提交來跟蹤修改.
這裏我在 pure 主題上 fork 出了一個本身的主題倉庫 my-hexo-theme-pure, 使用這個倉庫按照以前的步驟替換本來的主題來做爲子模塊.
修改子模塊
當運行 git submodule update
從子模塊倉庫中抓取修改時, Git 將會得到這些改動並更新子目錄中的文件, 可是會將子倉庫留在一個稱做 遊離的 HEAD
的狀態. 這意味着沒有本地工做分支(例如 "master")跟蹤改動, 此時作的任何改動都不會被跟蹤. 所以, 咱們首先須要進入子模塊目錄而後檢出一個分支.
$ git checkout stable
Switched to branch 'stable'
複製代碼
若子分支倉庫中有未同步的更新, 可經過 git submodule update --remote --rebase
來同步最新的內容. 以後即可以打開編輯器在子模塊上工做修改代碼了.
同步源主題的修改
主題做者發佈了新的主題功能或者修復了Bug, 咱們想同步到本身的自定義主題當中. 由於咱們的自定義主題是從原主題中 fork 出來的, 能夠經過 git remote add source https://github.com/cofess/hexo-theme-pure
命令將源主題倉庫添加爲子模塊的 一個新的 source
倉庫. 而後運行 git fetch
拉取修改後, 即可以經過 git merge origin/master
來同步源主題的更新了.
發佈子模塊的修改
子模塊修改完成後, 咱們即可以發佈到倉庫中, 以便在其餘地方從新 clone 時可使用最新的主題文件. 爲了防止咱們遺忘子模塊的提交, 能夠在 push 時經過 git push --recurse-submodules=check
命令, 若是任何提交的子模塊改動沒有推送那麼 check 選項會直接使 push 操做失敗.
另外也可使用 git push --recurse-submodules=on-demand
git 會自動嘗試推送變動的子項目.
以上介紹了使用子模塊來管理 themes 的方法, 實際上在 hexo 中還可使用 子模塊來管理 hexo 的靜態部署文件. 對於使用 github 託管靜態頁面等部署方式的用戶而言, 經過 hexo-deployer-git
插件能夠方便的自動化部署靜態頁面.
hexo-deployer-git 工做流程
hexo-deployer-git
部署的方式是在 hexo 項目根目錄下建立了一個 .deploy_git
文件夾, 並在其中建立了一個獨立的 git 分支, 將生成靜態文件移入這個文件夾中並推送到指定的地址. 但 .deploy_git
文件夾默認也被寫入 .gitignore
文件中, hexo 項目 git 庫不會記錄這個文件夾, 同時 hexo-deployer-git
在每次部署時也不會自動同步服務器上的提交歷史, 而是強制覆蓋舊的提交. 在新的電腦或路徑上從新 clone 後也會出現舊的靜態文件記錄丟失的狀況, 從新 deploy 後服務器上舊的部署歷史也會丟失.
若是想要保存每次的部署記錄, 那麼就能夠將 .deploy_git
中的文件也看作一個子項目, 以子項目的形式提交到 hexo 主項目中保存, 就能夠保持部署記錄不丟失, 而且在任何地方從新 clone 時均可以恢復最新的記錄.
添加 .deploy_git 中分支爲子項目
.deploy_git
中是由部署插件在 hexo 項目上建立的一個獨立分支, 只需經過傳遞 -b
選項將 hexo 項目的這個分支做爲主項目的依賴便可, 例如部署在 coding
時, 使用的 coding-pages
分支:
git submodule add -b coding-pages <site>
複製代碼
Pro Git book - 子模塊 git-scm.com/book/zh/v2/…