前言

今天有人问我博客页脚footer里的 git hash 是怎么显示的,就是页面底部里的69d6ffe这一串数字。

footer

他遇到了跟我一样的坑,.GitInfo不能正确显示。

原因

虽然 Hugo 在很早的版本里就支持通过enableGitInfo开启.GitInfo变量,但是这个变量只对 Hugo 网站文件生效,不对content目录生效,具体可以参考这条 Issue 里 bep 的回复:

value will only change if the content changes, correct?

Yes, the GitInfo is used to set dates to individual files (which then is used to determine .Site.LastChange). Only the content files (e.g. .md) is considered here.

在一些 CI/CD 中为了节省时间、空间等,会加上--depth=1只克隆最新的一个 Commit 历史进行构建,这样就会有可能丢失掉content目录里的一些.md文件的.GitInfo。在模板中引用{{ .GitInfo.Hash }}footer.html)这样的变量时就不会显示。

如果去掉--depth=1从而进行完整克隆时,构建的文章页面,虽然会显示{{ .GitInfo.Hash }},但显示的不是最新的 Commit hash。

变通方案

除了向官方反馈此问题(可能不一定被采纳),也有另外的方法可以实现。我用了一个笨方法。符合我的理念,先能干活,再谈优化。希望有更好方法的朋友可以教教我。

  1. 在 Hugo 根目录新建一个脚本githash.sh
#!/bin/bash

hash=`git log --pretty=format:"%H" -n 1`
echo $hash
sed -i "s/69d6ffe319557706dcf4150e960e7b7e21a37d9f/$hash/g" themes/hello-friend/layouts/partials/githash.html

其中69d6ffe319557706dcf4150e960e7b7e21a37d9f是为了方便用脚本替换,随便写的一个字符串,与模板文件githash.html里的字符串对应即可。

  1. theme/layouts/partials目录新建一个githash.html模板文件:
<a href="https://github.com/eallion/eallion.com/commit/69d6ffe319557706dcf4150e960e7b7e21a37d9f" target="_blank" rel="noopener noreferrer" >{{ substr "69d6ffe319557706dcf4150e960e7b7e21a37d9f" 0 7 }}</a>
  1. footer.html需要显示 GitHash 的位置引用这模板:
{{ partial "githash.html" . }}
  1. 构建 Hugo 前(在本地或在 CI/CD 中),先运行一次这个脚本再构建 Hugo 。
bash githash.sh
hugo --cleanDestinationDir --forceSyncStatic --gc --ignoreCache --minify --enableGitInfo

GitHub Actions Workflows:

jobs:
  build-deploy:
    runs-on: ubuntu-18.04
    steps:
    ......
      - name: Build Hugo
        run: |
+         bash githash.sh
          hugo --cleanDestinationDir --forceSyncStatic --gc --ignoreCache --minify --enableGitInfo
    ......