原文:Hexo git deployer removes commits history? Let's do something about that!
我發現 Hexo 是構建部落格和應用許多知名的軟體開發原則的好工具,其中之一是自動化。這就是我決定將此部落格與 Travis CI 整合以執行 GitHub pages 部署的原因。但幾天之後我注意到一個重要問題 - 從 CI 伺服器部署新版本的部落格導致從 master
分支中刪除所有提交併從一次又一次地初始化提交開始。我花了一段時間才找到解決這個問題的工作方案。這篇博文解釋了這個問題的簡單解決方案。
為什麼 hexo deploy
會首先刪除歷史記錄?
讓我們從瞭解實際發生的事情開始。當你為 git 部署選項執行 hexo deploy
[1]命令時,Hexo 會建立一個名為 .deploy_git
的隱藏資料夾,並將生成的檔案從 public
資料夾複製到該資料夾。接下來,它初始化目標為 Hexo 遠端部署分支的git儲存庫(如果它尚不存在),並從該資料夾執行 git push --force
到倉庫和你在 _config.yml
[2]檔案中定義的分支。
清單1. 部落格的部署配置
deploy:
type: git
repo: git@github.com:wololock/wololock.github.io.git
branch: master
複製程式碼
如果你從本地計算機構建和部署部落格,並且永遠不會刪除(或意外丟失)你的部落格原始碼,你可能永遠不會遇到此問題。當你從未被擦除的工作空間執行此操作時,則存在具有完整歷史記錄的資料夾 .deploy_git
,並且 hexo deploy
僅推送實際修改的那些檔案。當你遷移到像 Travis CI
這樣的 CI 伺服器時,這就變了,因為它使用乾淨的工作區和倉庫的新克隆執行構建。在這種情況下,.deploy_git
資料夾根本不存在,將從頭開始重新建立。
那麼如何部署和儲存歷史呢?
我發現解決方案非常簡單。以前我負責部署的 .travis.yml
檔案部分看起來像這樣:
清單2. 以前的 Travis CI
部署配置
deploy:
skip_cleanup: true
provider: script
script: hexo deploy
on:
branch: develop
複製程式碼
只要我將更改推送到 develop
分支,它就會觸發 hexo deploy
。在這種情況下,它最終建立了一個新的 .deploy_git
資料夾並強制將初始提交推送到 GitHub 倉庫。然後,我做了一個小改進 - 我建立了一個簡短的 bash 指令碼。
清單3. 部署部落格使用的指令碼
#!/bin/bash
# 使用已部署檔案初始化目標
git clone --depth 1 --branch=master https://github.com/wololock/wololock.github.io.git .deploy_git
cd .deploy_git
#從 ../public/ 複製之前刪除所有檔案
# 這樣 git 可以跟蹤上次提交中刪除的檔案
find . -path ./.git -prune -o -exec rm -rf {} \; 2> /dev/null
cd ../
# 部署
hexo clean
hexo deploy
複製程式碼
這個指令碼完全按照它在註釋中所說的那樣做:
- 它將
master
分支從遠端儲存庫克隆到.deploy_git
以獲取現有提交歷史記錄。 - 然後它從
.deploy_git
中刪除所有非 git 物件儲存庫檔案,因此從public
資料夾複製檔案將跟蹤已刪除的檔案。 - 最後 - 它執行常規部署的
hexo deploy
命令。
最後,這是在引入部署bash指令碼後的部署配置部分:
清單4. 當前的 Travis CI
部署配置
deploy:
skip_cleanup: true
provider: script
script: sh deploy.sh
on:
branch: develop
複製程式碼
由於這個解決方案,我能夠保留站點更新的歷史記錄,並跟蹤使用給定站點更新實際修改的檔案的更改。
最後的話
我希望你發現這篇文章很有用。它描述了 Hexo + Travis CI + GitHub 用例的解決方案,但它可以解決從 CI 伺服器環境執行時其他類似靜態站點生成器可能遇到的問題。
參考
- Documentation: hexo.io/docs/deploy…
- github.com/wololock/wo…