git tagでsortとformatを使いこなそう

git tagのデフォルトだと、情報量が少なくてあんまりよくわからんこと多いので使い方調べたメモ


## 基本

めんどくさくてwebで調べがちだけど、manを一度読むべき.

```
$ man git-tag
NAME
       git-tag - Create, list, delete or verify a tag object signed with GPG

SYNOPSIS
       git tag [-a | -s | -u <keyid>] [-f] [-m <msg> | -F <file>] [-e]
               <tagname> [<commit> | <object>]
       git tag -d <tagname>...
       git tag [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>]
               [--points-at <object>] [--column[=<options>] | --no-column]
               [--create-reflog] [--sort=<key>] [--format=<format>]
               [--merged <commit>] [--no-merged <commit>] [<pattern>...]
       git tag -v [--format=<format>] <tagname>...
```

タグ付けする使い方

```
git tag [-a | -s | -u <keyid>] [-f] [-m <msg> | -F <file>] [-e] <tagname> [<commit> | <object>]
```

タグを削除する使い方

```
git tag -d <tagname>...
```

タグをリストアップする使い方

```
git tag [-n[<num>]] -l [--contains <commit>] [--no-contains <commit>] ...
```

タグのGPG signatureをverifyする使い方

```
git tag -v [--format=<format>] <tagname>...
```

## タグのリストアップ

デフォルトだとタグのみ

```shell-session
$ git tag -l
0.0.5
0.0.7
v0.0.1
v0.0.2
v0.0.3
v0.0.4
v0.0.5
v0.0.6
v0.0.7
v1.0.0
v1.1.0
v1.1.1
v1.1.2
v1.1.3
v1.2.0
v1.2.1
v1.3.0
```

### format

`--format` でフォーマット指定. デフォルトは `%(refname:strip=2)`.

```
$ git tag -n -l --format='%(refname:strip=2)'
0.0.5
0.0.7
v0.0.1
v0.0.2
v0.0.3
v0.0.4
v0.0.5
v0.0.6
v0.0.7
v1.0.0
v1.1.0
v1.1.1
v1.1.2
v1.1.3
v1.2.0
v1.2.1
v1.3.0
```

使えるkeyの一覧はmanにはのってなかった. 直接sourceをみるとこれっぽい.
- https://github.com/git/git/blob/v2.17.0/ref-filter.c#L328-L371

よく使いそう
- refname: tagの名前とか
- authorname: 作った人
- authordate: 作った日付
- subject: コミットメッセージ

```shell-session
$ git tag -n -l --format='%(refname:strip=2) %(authordate:short) %(authorname) %(subject)'
0.0.5 2019-05-15 Juan Leni fixing linter issues
0.0.7 2020-03-27 Joshua Harshman Partial Revert of #922 (#1068)
v0.0.1 2017-10-12 Thomas Cyron Create new buffer if not present yet (#549)
v0.0.2 2018-03-21 Michael Update the Travis and CircleCI Go versions (#651)
v0.0.3 2018-04-27 Zef Hemel Fixed code sample for bash completion (#687)
v0.0.4 2019-03-21 Willi Eggeling added variable to allow configuration of mousetrap message duration (#809)
v0.0.5 2019-05-15 Juan Leni fixing linter issues
v0.0.6 2020-02-20 Alexandr Burdiyan Add support for context.Context
v0.0.7 2020-03-27 Joshua Harshman Partial Revert of #922 (#1068)
v1.0.0 2020-04-10 Marc Khouzam Fish completion using Go completion (#1048)
v1.1.0 2020-10-14 Adam Demuri Add example for making persistent flags required (#1135)
v1.1.1 2020-10-18 Sascha Steinbiss fix manpage building with new go-md2man (#1255)
v1.1.2 2021-02-09 Anthony Fok Update CHANGELOG.md for v1.1.2
v1.1.3 2021-02-10 Anthony Fok Fix typo
v1.2.0 2021-07-01 Marc Khouzam Fix documentation (#1434)
v1.2.1 2021-07-02 Paul Holzinger Fix flag completion (#1438)
v1.3.0 2021-12-14 dependabot[bot] Bump github.com/spf13/viper from 1.9.0 to 1.10.0 (#1561)
```

authordateなんかのフォーマットはここらへんっっぽい
- https://github.com/git/git/blob/e773545c7fe7eca21b134847f4fc2cbc9547fa14/Documentation/rev-list-options.txt#L1007-L1062
- `relative/local/iso/iso-strict/rfc/short/raw/human/unix/format/default/rfc2822` なんかが使えるっぽい

formatが何でも自由にできて便利

```
$ git tag -n -l --format='%(refname:strip=2) %(authordate:format:%Y-%m-%d_%H:%M:%S)'
0.0.5 2019-05-15_18:53:39
0.0.7 2020-03-27_14:38:32
v0.0.1 2017-10-12_20:25:33
v0.0.2 2018-03-21_14:39:34
v0.0.3 2018-04-27_15:45:50
v0.0.4 2019-03-21_01:05:52
v0.0.5 2019-05-15_18:53:39
v0.0.6 2020-02-20_07:29:50
v0.0.7 2020-03-27_14:38:32
v1.0.0 2020-04-10_15:56:28
v1.1.0 2020-10-14_09:53:09
v1.1.1 2020-10-18_20:59:26
v1.1.2 2021-02-09_18:39:00
v1.1.3 2021-02-10_12:40:59
v1.2.0 2021-07-01_11:49:30
v1.2.1 2021-07-02_17:25:47
v1.3.0 2021-12-14_11:22:51
```

### sort

表示したらsortもついでにやりたいのが人の常.

`--sort` でkeyを指定してソートできる.


```shell-session
$ git tag -l --sort refname | head
0.0.5
0.0.7
v0.0.1
v0.0.2
v0.0.3
v0.0.4
v0.0.5
v0.0.6
v0.0.7
v1.0.0
```


keyのまえに`-`をつけることでreverse sortできる.

```
$ git tag -l --sort -refname | head
v1.3.0
v1.2.1
v1.2.0
v1.1.3
v1.1.2
v1.1.1
v1.1.0
v1.0.0
v0.0.7
v0.0.6
```

key listはformat同様に使えるっぽい
-  https://github.com/git/git/blob/v2.17.0/ref-filter.c#L328-L371

authordateとか使うと最新順で並びそう

```shell-session
$ git tag -l --sort -authordate | head
v1.3.0
v1.2.1
v1.2.0
v1.1.3
v1.1.2
v1.1.1
v1.1.0
v1.0.0
0.0.7
v0.0.7
```


## おわり

git-tagでsortとformat使えると便利.
いろんなOSSのプロジェクトでgit-tag表示すると楽しい.
vつけるのミスってたり、夜中にコミットしてたりで人間味が感じられるよね.