593

Git で最新のタグを取得する最も簡単な方法は何ですか?

git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag

出力:

a
b
c

各タグの日時を取得して比較するスクリプトを作成する必要がありますか?

4

25 に答える 25

796

最新のタグを取得するには (その後の出力例):

git describe --tags --abbrev=0   # 0.1.0-dev

タグ付けされたオブジェクトの上に追加されたコミットの数などを使用して、最新のタグを取得するには:

git describe --tags              # 0.1.0-dev-93-g1416689

最新の注釈付きタグを取得するには:

git describe --abbrev=0
于 2011-08-31T17:39:29.673 に答える
497

あなたがgit describe求めていることに近いことをする を見てください。

于 2009-09-10T11:58:14.707 に答える
423

すべてのブランチで最新のタグ付きコミットのタグを出力します

git describe --tags $(git rev-list --tags --max-count=1)
于 2011-11-02T11:02:44.430 に答える
44

これはどう?

TAG=$(git describe $(git rev-list --tags --max-count=1))

技術的には、必ずしも最新のタグを取得するとは限りませんが、タグ付けされた最新のコミットは、探しているものである場合とそうでない場合があります。

于 2009-11-26T20:11:18.850 に答える
26

「最新」には、git に関して 2 つの意味があります。

「どのタグの作成日が最も遅いか」という意味であり、ここでの回答のほとんどはその質問に対するものです。あなたの質問に関しては、 tag を返したいと思うでしょうc

または、「開発履歴で名前付きブランチに最も近いタグはどれか」という意味でもかまいません。通常は、あなたがいるブランチですHEAD。あなたの質問では、これは tag を返しaます。

もちろん、これらは異なる場合があります。

A->B->C->D->E->F (HEAD)
       \     \
        \     X->Y->Z (v0.2)
         P->Q (v0.1)

開発者が月曜日にタグ付けZされ、火曜日にタグ付けされたと想像してください。 は最近のものですが、開発の歴史では HEAD に近く、その道筋は HEAD に近い点から始まります。v0.2Qv0.1v0.1v0.2

通常、この 2 番目の回答は、開発履歴に近い方がよいと思います。git log v0.2..HEAD各タグに etc を使用すると、それを見つけることができます。これにより、 で終わるv0.2パスが HEAD が続くパスから分岐してからの HEAD でのコミットの数がわかります。

このチェックを実行しているすべてのタグを反復処理し、タグ パスが分岐してから HEAD でのコミットが最も少ないタグを出力する Python スクリプトを次に示します。

https://github.com/MacPython/terryfy/blob/master/git-closest-tag

git describe(例) HEAD からさかのぼって、HEAD から履歴をさかのぼるパス上にある最初のタグを見つけるという点で、少し異なることを行います。git 用語でgit describeは、HEAD から「到達可能な」タグを探します。v0.2したがって、HEAD から戻るパス上ではなく、そこから分岐したパス上にあるようなタグは検出されません。

于 2014-07-03T15:09:33.980 に答える
25

git describe --tags

現在のブランチで確認できる最後のタグを返します

于 2012-06-06T14:05:38.433 に答える
16
git tag -l ac* | tail -n1

接頭辞"ac"を持つ最後のタグを取得します。たとえば、ac1.0.0、またはで名前が付けられたタグac1.0.51.0.0という名前の他のタグ1.1.0は無視されます。

git tag -l [0-9].* | tail -n1

最初の文字が である最後のタグを取得し0-9ます。したがって、最初の文字を持つタグはa-z無視されます。

より詳しい情報

git tag --help # Help for `git tag`

git tag -l <pattern>

指定されたパターン (パターンが指定されていない場合はすべて) に一致する名前を持つタグをリストします。引数なしで「git tag」を実行すると、すべてのタグも一覧表示されます。パターンはシェルのワイルドカード (つまり、fnmatch(3) を使用して一致) です。複数のパターンを指定できます。それらのいずれかが一致する場合、タグが表示されます。


tail -n <number> # display the last part of a file
tail -n1 # Display the last item 

アップデート

git tag --helpsort引数について。プロパティが存在しないlexicorgraphic order場合、デフォルトで使用されます。tag.sort

ソート順のデフォルトは、tag.sort 変数が存在する場合はその値に設定され、それ以外の場合は辞書順になります。git-config(1) を参照してください。

Google の後、誰かがgit 2.8.0 は次の構文をサポートすると言いました。

git tag --sort=committerdate
于 2016-02-25T08:23:55.047 に答える
16

すべての提案 (この回答投稿の最新のMatthew Brettの説明 を除く) の何が問題になっていますか?

履歴の別の時点で、jQuery Git 履歴で他の人が提供するコマンドを実行し、視覚的なタグ付け履歴表現で結果を確認するだけです(私が行ったので、この投稿が表示されます)。

$ git log --graph --all --decorate --oneline --simplify-by-decoration

今日の多くのプロジェクトは、メインラインとは別のブランチでリリース (およびタグ付け) を実行しています。

これには強い理由があります。十分に確立された JS/CSS プロジェクトを見てください。ユーザー規約のために、DVCS でバイナリ/縮小リリース ファイルを運びます。当然のことながら、プロジェクトのメンテナーとして、役に立たないバイナリ BLOB でメインラインの差分履歴を破棄したり、メインラインからビルド アーティファクトのコミットを実行したりしたくありません。

Git は線形履歴ではなく DAG を使用するため、距離メトリックを定義するのは難しいため、 言うことができますHEAD

私は自分の旅を始めます(中を見てください。この長い投稿に派手な証拠の画像をコピーしていません):

Git での分岐に関して過去に最も近いタグは何ですか?

現在、有用性が低下するタグとリビジョン間の距離の合理的な定義が 4 つあります。

  • タグとベースHEADマージするための最短パスの長さ
  • と タグの間のマージ ベースの日付HEAD
  • HEAD からは到達できるが、タグからは到達できない回転数
  • マージベースに関係なく、タグの日付

最短経路の長さを計算する方法がわかりません。

と タグの間のマージ ベースの日付に従ってタグを並べ替えるスクリプト :HEAD

$ git tag \
     | while read t; do \
         b=`git merge-base HEAD $t`; \
         echo `git log -n 1 $b --format=%ai` $t; \
       done | sort

ほとんどのプロジェクトで使用できます。

HEAD からは到達できるがタグからは到達できないrev の数に従ってタグをソートするスクリプト:

$ git tag \
    | while read t; do echo `git rev-list --count $t..HEAD` $t; done \
    | sort -n

あなたのプロジェクトの履歴が変な日付でコミットされている場合 (リベースや別の履歴の書き換え、または一部の愚か者が BIOS のバッテリーを交換するのを忘れたり、履歴に対して行ったその他の魔法が原因で)、上記のスクリプトを使用します。

最後のオプション (マージベースに関係なくタグの日付) を使用して、日付でソートされたタグのリストを取得するには:

$ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r

既知の現在のリビジョン日付を取得するには、次を使用します。

$ git log --max-count=1

git describe --tags独自のケースで使用できますが、プロジェクト履歴で人間が予想する最も近いタグを見つけるためではないことに注意してください。

上記のレシピはどのリビジョンでも使用できHEADます。必要なものに置き換えるだけです!

于 2015-12-12T11:16:00.763 に答える
5

最後の 2 つのタグが必要な場合 (たとえば、現在のタグと前のタグの間の変更ログを生成するため) は、次のように機能します。最新のタグがHEAD.

PreviousAndCurrentGitTag=`git describe --tags \`git rev-list --tags --abbrev=0 --max-count=2\` --abbrev=0`
PreviousGitTag=`echo $PreviousAndCurrentGitTag | cut -f 2 -d ' '`
CurrentGitTag=`echo $PreviousAndCurrentGitTag | cut -f 1 -d ' '`

GitLog=`git log ${PreviousGitTag}..${CurrentGitTag} --pretty=oneline | sed "s_.\{41\}\(.*\)_; \1_"`

それは私のニーズに合っていますが、私は git ウィザードではないので、さらに改善できると確信しています。また、コミット履歴が進むと壊れると思います。誰かに役立つ場合に備えて共有しています。

于 2013-01-22T17:10:41.717 に答える
4

私が最初に考えたのはgit rev-list HEAD、 と組み合わせて、すべてのリビジョンを新しい順にリストする を使用できるということですgit tag --contains。空でないリストを生成する ref を見つけると、git tag --contains最新のタグが見つかりました。

于 2009-09-10T12:03:18.250 に答える
4

特定のブランチに適用された最後のタグを見つけたい場合は、次のことを試すことができます。

git describe --tag $(git rev-parse --verify refs/remotes/origin/"branch_name")
于 2018-04-27T15:56:48.403 に答える