Edited at

GNU sort で git ls-remote 出力結果をバージョン番号でソートする

More than 3 years have passed since last update.

たとえば git ls-remote --tags の出力結果をバージョン番号で降順ソートする際、普通に sort コマンドにパイプした場合、デフォルトのソートが辞書順のためバージョン番号的には古い要素が新しい要素より前に来てしまうことがある。

$ git ls-remote --tags git@github.com:nodejs/node | sort -t '/' -k 3 -r

(中略)
51ada433640fd646a9496fd0e8cdc946ed86a06c refs/tags/v0.2.0
ffc1395af0d5495be442eaefd9ce4dd6561c6dba refs/tags/v0.12.9^{}
(中略)

こんな場合は -V オプションをつけてあげれば大丈夫。

$ man sort

(中略)
-V, --version-sort
natural sort of (version) numbers within text
(中略)

どうやらマイナーバージョンが含まれたバージョニングにおいても適切にソートしてくれるらしい。

実際に適用してみるとこんな感じ。

$ git ls-remote --tags git@github.com:nodejs/node | sort -t '/' -k 3 -rV

(中略)
8192b251d11e99c207e2f6ca4db19d7123d82dba refs/tags/v1.0.0
ffc1395af0d5495be442eaefd9ce4dd6561c6dba refs/tags/v0.12.9^{}
(中略)

ちゃんと0系の最新が1系の直後にソートされるようになった。


このオプション、Mac に標準で含まれてる BSD sort だと利用できなかった。

Mac でも利用したい場合は coreutils を Homebrew で入れてあげればOK。

$ brew install coreutils

プレフィックス系のオプション何もつけない場合 gsort コマンドとしてインストールされる。

$ git ls-remote --tags git@github.com:nodejs/node | gsort -t '/' -k 3 -Vr

もちろんインストール時にプレフィックス指定するなり、エイリアス貼るなりすれば sort コマンドそのままで GNU 版を利用することができるようになると思う。