原文:Hexo git deployer removes commits history? Let's do something about that!git
我發現 Hexo 是構建博客和應用許多知名的軟件開發原則的好工具,其中之一是自動化。這就是我決定將此博客與 Travis CI 集成以執行 GitHub pages 部署的緣由。但幾天以後我注意到一個重要問題 - 從 CI 服務器部署新版本的博客致使從 master
分支中刪除全部提交併從一次又一次地初始化提交開始。我花了一段時間才找到解決這個問題的工做方案。這篇博文解釋了這個問題的簡單解決方案。github
<!--more-->bash
hexo deploy
會首先刪除歷史記錄?讓咱們從瞭解實際發生的事情開始。當你爲 git 部署選項運行 hexo deploy
[1]命令時,Hexo 會建立一個名爲 .deploy_git
的隱藏文件夾,並將生成的文件從 public
文件夾複製到該文件夾。接下來,它初始化目標爲 Hexo 遠程部署分支的git存儲庫(若是它尚不存在),並從該文件夾執行 git push --force
到倉庫和你在 _config.yml
[2]文件中定義的分支。服務器
清單1. 博客的部署配置hexo
deploy: type: git repo: git@github.com:wololock/wololock.github.io.git branch: master
若是你從本地計算機構建和部署博客,而且永遠不會刪除(或意外丟失)你的博客源代碼,你可能永遠不會遇到此問題。當你從未被擦除的工做空間執行此操做時,則存在具備完整歷史記錄的文件夾 .deploy_git
,而且 hexo deploy
僅推送實際修改的那些文件。當你遷移到像 Travis CI
這樣的 CI 服務器時,這就變了,由於它使用乾淨的工做區和倉庫的新克隆執行構建。在這種狀況下,.deploy_git
文件夾根本不存在,將從頭開始從新建立。ide
我發現解決方案很是簡單。之前我負責部署的 .travis.yml
文件部分看起來像這樣:工具
清單2. 之前的 Travis CI
部署配置spa
deploy: skip_cleanup: true provider: script script: hexo deploy on: branch: develop
只要我將更改推送到 develop
分支,它就會觸發 hexo deploy
。在這種狀況下,它最終建立了一個新的 .deploy_git
文件夾並強制將初始提交推送到 GitHub 倉庫。而後,我作了一個小改進 - 我建立了一個簡短的 bash 腳本。code
清單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 服務器環境運行時其餘相似靜態站點生成器可能遇到的問題。