うぃろぅ.log

140字で綴りきれない日々の徒然備忘録

Gitでインクリメントしたバージョンタグを設定するエイリアス

うぃろぅです。

技術系のエントリー全く書いていないので書き方を忘れています。
今いるプロジェクトはそれなりに炎上中です。まだ寒い日も続くしちょうどいいね。

さて、リハビリがてら最近書いたgitエイリアスを置いておきます。
もっと便利なプラグインはたくさんあると思いますが、プロジェクト規約的に多分NGなので…。

何がしたいの

gitのmasterに設定されている最新のタグをv1.2.3としたとき

  • git tag-new --minor "性能改善"v1.3.0 "性能改善"
  • git tag-new --patch "バグ改修"v1.2.4 "バグ改修

と最新のコミットに設定してpushしたい。
※ メジャーアップデートは当分無理そうなので考慮しない()
2023/7/5 アプデ メジャーアップデートに対応しつつvの付与タイミングを変更。

git-flowが導入されていないため、エイリアスを書いて対応します。
シェルスクリプトの勉強にもなるし良い機会かなと。

かいたもの

ざっくりとした書き方やお手本は以下の記事を参考にした。

rcmdnk.com

rcmdnk.com

.gitconfigに以下を記載

[alias]
  tag-new = "!f () {\
    if [ \"$#\" != 2 ]; then\
      echo \"usage: git tag-new [--major/--minor/--patch] [COMMENT]\";\
      return 1;\
    fi;\
    if [ \"$1\" != \"--major\" ] && [ \"$1\" != \"--minor\" ] && [ $1 != \"--patch\" ]; then\
      echo \"usage: git tag-new [--major/--minor/--patch] [COMMENT]\";\
      return 1;\
    fi;\
    tag=$(git tag | sed s/v//g | sort -t . -n -k1,1 -k2,2 -k3,3 | tail -n1);\
    if [ \"$1\" == \"--major\" ]; then\
      tag_major=${tag%%.*};\
      ((tag_major++));\
      tag=${tag_major}.0.0;\
    elif [ \"$1\" == \"--minor\" ]; then\
      tag_minor=${tag#*.};\
      tag_minor=${tag_minor%.*};\
      ((tag_minor++));\
      tag=${tag%%.*}.${tag_minor}.0;\
    else\
      tag_patch=${tag##*.};\
      ((tag_patch++));\
      tag=${tag%.*}.${tag_patch};\
    fi;\
    tag=v${tag};\
    comment=\"$2\";\
    echo ${tag} ${comment};\
    tagcheck=$(git tag | grep ${tag});\
    if [ \"$tagcheck\" != \"\" ]; then\
      echo \"tag ${tag} exists\";\
      echo \"Please check tag\";\
      return 1;\
    fi;\
    git tag -a ${tag} -m \"${comment}\";\
    git push origin ${tag};\
  };f"

解説

「もっと簡単にかけるよ」という突っ込みはいつでも募集しています。

引数の数を固定

if [ \"$#\" != 2 ]; then .. fi

引数の数が2以外の時は使い方を表示して終了。

参考にしたサイト

it-ojisan.tokyo

オプション判定

if [ \"$1\" != \"--minor\" ] && [ $1 != \"--patch\" ]; then .. fi

上記同様使い方を表示して終了。

[] && [] って書くのね。

参考にしたサイト

qiita.com

最新のタグ取得

tag=$(git tag | sed s/v//g | sort -t . -n -k1,1 -k2,2 -k3,3 | tail -n1)

  1. git tagの結果から
  2. vを削除して
  3. .で区切った値でソートして
  4. 最後の値を取得

を1行で行っている。
メソッドチェーンみたいで少し楽しい。

メジャー番号設定

  1. tag_major=${tag%%.*};\でメジャー番号以外を削除して
  2. インクリメントして
  3. インクリメント後の数値 + .0.0 を設定

参考にしたサイト

dhythm.blog11.fc2.com

マイナー番号設定

  1. tag_minor=${tag#*.};\でメジャー番号を削除して
  2. tag_minor=${tag_minor%.*};\でパッチ番号を削除
  3. インクリメントして
  4. メジャー番号 + . + インクリメント後の数値 + .0を設定

としている。一発で取得もできそうな気がする。

パッチ番号取得

  1. tag_patch=${tag##*.};\でパッチ番号を取得して
  2. インクリメントして
  3. メジャーマイナー番号 + . + インクリメントした数値を設定

タグ設定

タグ番号にvを付与。

コメント設定

引数の値をそのまま設定。
echoで「これで設定するよ!」と教えてくれる。

既存タグチェック

  1. git tagでタグ一覧を取得して
  2. 設定しようとしているタグでgrepして
  3. マッチしたらエラー

としている。ここは参考にしたサイトの写経。

コマンド実行

  1. git tag -a ${tag} -m \"${comment}\";\でタグ設定して
  2. タグ名でpush

pushまでしている。
お試しで一瞬作ってすぐにgit push --delete TAGで消したけれどあんまりお試しはしたくないしタグを消したくもないのでちょっと心理的負荷が大きめ。

できた

このスクリプトで私がhotfixを処理したりリブ管のような人たちがreleaseを処理したりする予定。

そもそも今のプロジェクトはgitSVNだと思って開発している節があったため、改善ついでにこれを書きました。

その話はたぶん長くなるので気力があったら…書くかな…。

私はウマの育成に戻ります。
ではまた。