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

  • 4
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

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