Hugo的GitInfo为nil的问题 | Blurred code

Hugo的GitInfo为nil的问题

2022/02/18

LastMod:2022/03/06

Categories: hugo

我现在的博客程序用的是Hugo,并且版本Pin在了0.68.3,因为高版本似乎禁用了mmark这个格式但是我现在写Katex需要它。 最近试图增加一个新的功能,是追踪文章的LastMod更新时间,并且添加commit hash值和commit msg。

cmtmsg

对应的代码差不多类似于,需要用到Hugo提供的.GitInfo结构体(https://gohugo.io/variables/git/)。

{{ if and (.Site.Params.GitRepo.enable) (.GitInfo)}}
  <p class="date" title="Commit: {{ .GitInfo.Subject }}">LastMod:<a href="{{ .Site.Params.GitRepo.Host }}/{{ .GitInfo.AbbreviatedHash}}">{{ $lastmod }}</a></p> 
{{ else }}
  <p class="date">LastMod:{{ $lastmod }}</p> 
{{ end }}

获取的.GitInfo为nil

这个功能在本地是验证通过的没问题的,上传到CI上后发现部分文章并不能获取到GitInfo信息,调试一番以后发现其打印出来其值为Nil,但是有些文章如about.md这种又是能够正确生成的。 初步怀疑是Cloudflare Pages的编译环境可能有问题,换到Github Actions以后问题依然能够稳定重现,换着花样搜索也没有头绪。

发现问题

不死心的再换着花样搜索了一下,发现一个人的提问GitInfo fails if there is an umlaut in the folder path,大概就是文件路径里有元音字母的时候获取不到.GitInfo。 我突然意识到我获取不到.GitInfo的文章都是中文文件名,但是我本地的git关闭了quotepath这个设置,因此git能正确获取到其中文名字。

quotepath设置打开的时候,git会尝试把所有的非ASCII字符转义并用双引号将其包裹起来,如

而关闭quotepath的格式为

意识到这一点后,在CI的pipeline里多添加一步指令设置git关闭quotePath,问题就解决了,hugo也能正确获取到所有文章的Git信息了,见pages.yml