うぃろぅです。
技術系のエントリー全く書いていないので書き方を忘れています。
今いるプロジェクトはそれなりに炎上中です。まだ寒い日も続くしちょうどいいね。
さて、リハビリがてら最近書いた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
が導入されていないため、エイリアスを書いて対応します。
シェルスクリプトの勉強にもなるし良い機会かなと。
かいたもの
ざっくりとした書き方やお手本は以下の記事を参考にした。
.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以外の時は使い方を表示して終了。
参考にしたサイト
オプション判定
if [ \"$1\" != \"--minor\" ] && [ $1 != \"--patch\" ]; then .. fi
上記同様使い方を表示して終了。
[] && []
って書くのね。
参考にしたサイト
最新のタグ取得
tag=$(git tag | sed s/v//g | sort -t . -n -k1,1 -k2,2 -k3,3 | tail -n1)
git tag
の結果からv
を削除して.
で区切った値でソートして- 最後の値を取得
を1行で行っている。
メソッドチェーンみたいで少し楽しい。
メジャー番号設定
tag_major=${tag%%.*};\
でメジャー番号以外を削除して- インクリメントして
インクリメント後の数値
+.0.0
を設定
参考にしたサイト
マイナー番号設定
tag_minor=${tag#*.};\
でメジャー番号を削除してtag_minor=${tag_minor%.*};\
でパッチ番号を削除- インクリメントして
- メジャー番号 +
.
+インクリメント後の数値
+.0
を設定
としている。一発で取得もできそうな気がする。
パッチ番号取得
tag_patch=${tag##*.};\
でパッチ番号を取得して- インクリメントして
- メジャーマイナー番号 +
.
+インクリメントした数値
を設定
タグ設定
タグ番号にv
を付与。
コメント設定
引数の値をそのまま設定。
echo
で「これで設定するよ!」と教えてくれる。
既存タグチェック
git tag
でタグ一覧を取得して- 設定しようとしているタグで
grep
して - マッチしたらエラー
としている。ここは参考にしたサイトの写経。
コマンド実行
git tag -a ${tag} -m \"${comment}\";\
でタグ設定して- タグ名で
push
push
までしている。
お試しで一瞬作ってすぐにgit push --delete TAG
で消したけれどあんまりお試しはしたくないしタグを消したくもないのでちょっと心理的負荷が大きめ。
できた
このスクリプトで私がhotfix
を処理したりリブ管のような人たちがrelease
を処理したりする予定。
そもそも今のプロジェクトはgit
をSVN
だと思って開発している節があったため、改善ついでにこれを書きました。
その話はたぶん長くなるので気力があったら…書くかな…。
私はウマの育成に戻ります。
ではまた。