Help us understand the problem. What is going on with this article?

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 版を利用することができるようになると思う。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away