🐾

git log で Go の疑似バージョン表記を出す

2023/09/09に公開

結論

TZ=UTC git log --date=format-local:'%Y%m%d%H%M%S' --abbrev=12 --format='v0.0.0-%cd-%h    %s'

を実行すればいい。

実行例

$ TZ=UTC git log --date=format-local:'%Y%m%d%H%M%S' --abbrev=12 --format='v0.0.0-%cd-%h    %s' -10
v0.0.0-20230906232137-654a3c66be98    Update module github.com/hashicorp/terraform-plugin-sdk/v2 to v2.29.0
v0.0.0-20230904233526-1077d60ced9a    Merge pull request #125 from bgpat/renovate/actions-checkout-4.x
v0.0.0-20230904233517-0b7163fe1e9d    Update module github.com/hashicorp/terraform-plugin-sdk/v2 to v2.28.0
v0.0.0-20230904233129-9e289b1d432a    Update actions/checkout action to v4
v0.0.0-20230805024101-270bd80eb425    Merge pull request #123 from bgpat/renovate
v0.0.0-20230805023739-06d0f0b946de    Tweak renovate.json
v0.0.0-20230805023449-0c6149120647    Merge pull request #122 from bgpat/renovate-label
v0.0.0-20230805022208-6e872aadaaf7    Add dependencies label to renovate PR
v0.0.0-20230805022144-0b78967be185    Add renovate-config-validator workflow
v0.0.0-20230805014607-eb3934dacb9e    Merge pull request #121 from bgpat/bgpat-patch-1

経緯

fork した reviewdog を GitHub Actions で動かすために欲しくなった。
git clone して go build なり go install なりを実行するより直接 go install github.com/bgpat/reviewdog@v0.0.0-20230907141438-28d913ad231f みたいな感じでインストールした方が楽では!?と思って書いた。

よく考えると(よく考えなくても) clone して go install するのでもそんなに変わらない。

解説

Go の疑似バージョン表記

vX.Y.Z のような version tag が設定されていない場合に Go では疑似バージョン (pseudo-version) が使われる。
https://go.dev/ref/mod#pseudo-versions

疑似バージョンの形式は以下の通り。
既存の version tag がなかった場合は v0.0.0 になる。

<既存の version tag + 1>-<コミット日時(UTC) YYMMDDhhmmss>-<commit hash の先頭12桁>

コマンドの意味

Go の疑似バージョン表記を作れるように git log のフォーマットを作ればいい。

TZ=UTC

環境変数の $TZ を指定してタイムゾーンを UTC にする。
git log で使うときは --datelocalformat-local を指定すると $TZ が利用される。

--date=format-local:'%Y%m%d%H%M%S'

日付のフォーマットを指定している。
strftime の形式で指定する。

  • %Y
  • %m
  • %d
  • %H
  • %M
  • %S

--abbrev=12

短縮形の commit hash を12桁に変更している。

--format='v0.0.0-%cd-%h %s'

v0.0.0 の部分は version tag が設定されている場合は異なるのでよしなに変える。

%cd は短縮形の commit hash で %h はコミット日時を表す。
最後に見やすいようにスペースと %s で commit title を出すようにしている。

Discussion