142

コマンドを入力すると:

git tag -l

私はそのような結果を得ます:

rc-0.9.0.0
rc-0.9.0.1
rc-0.9.0.10
rc-0.9.0.11
rc-0.9.0.12
rc-0.9.0.2
rc-0.9.0.3
rc-0.9.0.4
rc-0.9.0.5
rc-0.9.0.6
rc-0.9.0.7
rc-0.9.0.8
rc-0.9.0.9

これの代わりに私が欲しい:

rc-0.9.0.0
rc-0.9.0.1
rc-0.9.0.2
rc-0.9.0.3
rc-0.9.0.4
rc-0.9.0.5
rc-0.9.0.6
rc-0.9.0.7
rc-0.9.0.8
rc-0.9.0.9
rc-0.9.0.10
rc-0.9.0.11
rc-0.9.0.12

現在のリストをソートしてそのような結果を得るにはどうすればよいですか?

4

9 に答える 9

204

バージョンソートを使用する

git tag -l | sort -V

または git バージョン >= 2.0 の場合

git tag -l --sort=v:refname
git tag -l --sort=-v:refname # reverse
于 2013-01-11T07:29:11.243 に答える
95

Git 2.0 (2014 年 6 月) では、並べ替え順序を指定できるようになります。

Nguyễn Thái Ngọc Duy ( )によって作成されたコミット 9ef176bのコミット b6de0c6を参照してください。pclouds

 --sort=<type>

特定の順序で並べ替えます。
サポートされているタイプは次のとおりです。

  • " refname" (辞書順),
  • " version:refname" または " v:refname" (タグ名はバージョンとして扱われます)。

-ソート順を逆にするには、先頭に" " を追加します。


したがって、次の場合:

git tag foo1.3 &&
git tag foo1.6 &&
git tag foo1.10

これがあなたが得るものです:

# lexical sort
git tag -l --sort=refname "foo*"
foo1.10
foo1.3
foo1.6

# version sort
git tag -l --sort=version:refname "foo*"
foo1.3
foo1.6
foo1.10

# reverse version sort
git tag -l --sort=-version:refname "foo*"
foo1.10
foo1.6
foo1.3

# reverse lexical sort
git tag -l --sort=-refname "foo*"
foo1.6
foo1.3
foo1.10

commit b150794 (by Jacob Keller、git 2.1.0、2014 年 8 月)以来、そのデフォルトの順序を指定できます。

tag.sort

この変数は、 で表示されるときのタグのソート順を制御しますgit-tag
" --sort=<value>" オプションを指定しないと、この変数の値がデフォルトとして使用されます。

ロビンストの コメント:

バージョンの並べ替え順序をデフォルトとして設定できるようになりました (Git 2.1+):

git config --global tag.sort version:refname

コメントでLeo Galleguillosが指摘したように:

最新のタグを最初に(降順で)表示するように Git を構成するには、 version の前にハイフンを追加します。
コマンドは次のようになります。

git config --global tag.sort -version:refname

Git 2.4 (Q2 2015)では、構成変数を使用して、 の前に来るように指定できますversionsort.prereleasev1.0-pre1v1.0

Junio C Hamano ( )によるコミット f57610aを参照してください。gitster

注 (以下を参照)versionsort.prereleaseSuffixは現在 (2017 年) の非推奨のエイリアスですversionsort.suffix


git 2.7.1 (2016 年 2 月) は、git tagそれ自体の出力を改善します。

commit 0571979 (2016 年 1 月 26 日) およびcommit 1d094db (2016 年 1 月 24 日) by Jeff King ( peff)を参照してください。
( 2016 年 2 月 1 日にcommit 8bad3deJunio C Hamanoによってマージされました)gitster

tagtags/foo: あいまいなタグ名を " "として表示しない

b7cc53e ( tag.c: use ' ref-filter' APIs、2015-07-11) 以降、あいまいgit tagな名前のタグ (つまり、" heads/foo" と " tags/foo" の両方が存在する場合) を " tags/foo" ではなく" " として表示するようになりfooました。
これは両方です:

  • 無意味です。" " の出力にgit tagは のみが含まれているため、" " は " " 内のものを意味するrefs/tagsことがわかります。foorefs/tags
  • あいまいです。foo元の出力では、行 " " が " " が存在することを意味していることがわかりrefs/tags/fooます。refs/tags/foo新しい出力では、「 」または「 」のどちらを意味するのかが明確ではありませんrefs/tags/tags/foo

これが発生する理由は、コミット b7cc53e がgit tagref-filter の " %(refname:short)" 出力フォーマットを使用するように切り替えられたためfor-each-refです。このより一般的なコードは、私たちがタグだけを気にしていることを知らず、 を使用shorten_unambiguous_refしてshort-name.
" " だけを気にすることを伝える必要がありrefs/tags/、その値に関しては短くする必要があります。

strip整形言語 " " に新しい修飾子を追加して、特定のプレフィックス コンポーネントのセットを削除してみましょう。
これにより、" " が修正git tagされ、ユーザーは独自のカスタム形式 (" tag" または " for-each-ref" 用)から同じ動作を呼び出せるようになりますが、" :short" はすべての場所で同じ一貫した意味を持ちます。

strip=<N>が追加されている場合、<N>スラッシュで区切られたパス コンポーネントを refname の先頭から削除します (たとえば、 に%(refname:strip=2)変わりrefs/tags/fooますfoo
<N>は正の整数でなければなりません。
表示された ref のコンポーネントが よりも少ない場合<N>、コマンドはエラーで中止されます。

の場合git tag、指定されていない場合、デフォルトは%(refname:strip=2)です。


Git 2.12 の更新 (2017 年第 1 四半期)

コミット c026557、コミットb178464コミット 51acfa9コミット b823166コミット 109064aコミット 0c1b487コミット 9ffda48コミット eba286e (2016 年 12 月 8 日) by SZEDER Gábor ( szeder)を参照してください。
( 2017 年 1 月 23 日、コミット 1ac244dJunio C Hamanoによってマージされました)gitster

versionsort.prereleaseSuffixの非推奨のエイリアスですversionsort.suffix

prereleaseSuffix" " で使用されているバージョン比較の機能はgit tag -l、同じリリースの 2 つ以上のプレリリースが存在する場合 (たとえば、2.02.0-beta1、および2.0-beta2 が存在し、コードで および を比較する必要がある2.0-beta1場合) に正しく機能しませんでした2.0-beta2

于 2014-03-25T12:29:12.093 に答える
12

この回答によるとsort -V、Windows や OSX などのサポートされていないプラットフォームでは、

git tag -l | sort -n -t. -k1,1 -k2,2 -k3,3 -k4,4

于 2014-06-18T10:21:56.560 に答える