Posted at

会社のgitのタグ付けルールが 日付 + 連番 の形式で、都度最新の連番を調べてタグ付けるのが面倒だったのでシェル書いた。

More than 5 years have passed since last update.

タイトルの通り。

git tag $(TODAY=`date +%Y%m%d`; git tag | grep -e ${TODAY} | cat - <(echo "${TODAY}_00") | sort | tail -1 | awk -F "_" "{cnt=\$2+1}{printf \"%s_%02d\", \$1, cnt}")

コテコテだけど、こんなかんじで。


ちょっと解説

やっていることはすげー簡単で...


  • 当日の最新のタグを取得

  • 連番部分に +1 して新しいタグを生成

こんだけ。もうちょっとkwsk。

ゴニョゴニョしているのがこの部分。

$(TODAY=`date +%Y%m%d`; git tag | grep -e ${TODAY} | cat - <(echo "${TODAY}_00") | sort | tail -1 | awk -F "_" "{cnt=\$2+1}{printf \"%s_%02d\", \$1, cnt}")

ひとつずつ見ていく。

TODAY=`date +%Y%m%d`;

ここは見ての通り、当日の日付を TODAY に代入している。

大事なのは次。

git tag | grep -e ${TODAY} | cat - <(echo "${TODAY}_00")

1つ目のパイプのところまででタグ一覧から当日のタグを抽出している。

ただ当日初回のタグ付けの場合は grep で絞った結果何も渡ってこないので2つ目のパイプが効いてくる。

... | cat - <(echo "${TODAY}_00")

パイプで受け取る標準入力に "${TODAY}_00" を加える。

前述のとおり、当日初回は grep の結果何も渡ってこないのでその場合は...

20140819_00

のようになる。(日付は 2014/08/19)

... | sort | tail -1 | awk -F "_" "{cnt=\$2+1}{printf \"%s_%02d\", \$1, cnt}"

その文字列を昇順で並び替えて最下行を取得して awk で連番を振る。

20140819_01

僕は gtag みたいなシェルのエイリアスとして登録して使ってます。

ちょっとした改善だけど、こういうシェル考えるの楽しいね!