[譯] Hexo git deployer 刪除了提交歷史記錄該怎麼整?

qiwihui發表於2019-01-25

原文: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
複製程式碼

由於這個解決方案,我能夠保留站點更新的歷史記錄,並跟蹤使用給定站點更新實際修改的檔案的更改。

github hexo history

最後的話

我希望你發現這篇文章很有用。它描述了 Hexo + Travis CI + GitHub 用例的解決方案,但它可以解決從 CI 伺服器環境執行時其他類似靜態站點生成器可能遇到的問題。

參考

  1. Documentation: hexo.io/docs/deploy…
  2. github.com/wololock/wo…

相關文章