web-dev-qa-db-ja.com

Gitの現在のブランチで最新のタグ名を取得する方法

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

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

出力:

a
b
c

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

394
culebrón

git describeを見てみるとよいでしょう。

368
JB.

最新のタグを取得するには

git describe --tags

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

git describe --abbrev=0
557
acassis

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

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

最新のタグを取得するには、次のようにします。

 $ git for-each-ref参照/タグ--sort = -taggerdate --format = '%(refname)' --count = 1 

もちろん、必要に応じてcount引数またはsortフィールドを変更することができます。あなたは少し違う質問をするつもりだったかもしれませんが、私が解釈するようにこれは質問に答えます。

37
William Pursell

これはどう?

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

技術的には、必ずしも最新のタグを取得するわけではありませんが、タグ付けされている最新のコミットを取得する必要はありません。

28

git describe --tags

現在のブランチで見ることができる最後のタグを返します

21
beenhere4hours

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

「どのタグの作成日が最も遅いか」という意味になりますが、ここでの回答の大部分はその質問に対するものです。質問に関しては、タグcを返すことをお勧めします。

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

これらはもちろん違うかもしれません:

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

開発者が月曜日にZv0.2としてタグ付けし、次に火曜日にQv0.1としてタグ付けすると想像してください。 v0.1はより最近のものですが、開発の歴史の中でv0.2はHEADにより近いところから始まるという意味で、HEADにより近い歴史があります。

私はあなたがたいていあなたがこの第二の答えを望んでいると思う、開発の歴史においてもっと近い。各タグにgit log v0.2..HEADなどを使用してそれを見つけることができます。 v0.2で終わるパスはHEADが続くパスから分岐しているので、これはあなたにHEADでのコミットの数を与えます。

これは、このチェックを実行しているすべてのタグを繰り返し処理し、タグパスが分岐していないため、HEADでのコミット数が最も少ないタグを出力するPythonスクリプトです。

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

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

20
Matthew Brett

あなたが実行することができます:git describe --tags $(git rev-list --tags --max-count=1)はここで話しました: 最新のタグ名を取得するには?

18
xserrat
git log --tags --no-walk --pretty="format:%d" | sed 2q | sed 's/[()]//g' | sed s/,[^,]*$// | sed  's ......  '

1つ前のタグよりも多く必要な場合

(git describe --tagsは時々間違ったハッシュを与える、私はその理由を知らない、しかし私にとって - max-count 2はうまくいかない)

これは、最新の2つのタグ名を時系列の逆順に並べたリストを取得する方法です。git 1.8.4では完全に機能します。 gitの以前のバージョン(1.7。*など)では、出力に "tag:"という文字列はありません - 最後のsed呼び出しを削除するだけです。

最新のタグが2つ以上必要な場合は、この「sed 2q」を「sed 5q」または必要なものに変更してください。

そうすれば、すべてのタグ名を変数などに簡単に解析できます。

13
east

すべての提案で間違っているとは何ですか( Matthew Brett 説明、この回答投稿の日付まで)。

履歴の異なるポイント視覚的なタグ付け履歴表現(I didで結果を確認するときに、他のjQuery Git履歴で提供されたコマンドを実行するだけですこの郵便受け):

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

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

これには強い理由があります。確立されたJS/CSSプロジェクトに注目してください。ユーザー規約のために、彼らはDVCSでバイナリ/縮小リリースファイルを運びます。当然、プロジェクトメンテナーとして、メインラインdiff履歴を無駄なバイナリBLOBでガベージして、ビルドアーティファクトout of mainlineをコミットすることは望ましくありません。

Gitは線形履歴ではなくDAGを使用しているため、距離メトリックを定義するのが難しいであるため、言うことができます-revは私のHEADに最も近いです!

私は自分の旅を始めます(中を見て、この長い投稿に豪華なプルーフの画像をコピーしませんでした):

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

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

  • 最短パスの長さからHEADからタグとベースをマージ
  • date of HEADとタグの間のベースをマージします
  • HEADからは到達可能だがタグからは到達できない回転数
  • dateタグに関係なくマージベース

最短パスの長さの計算方法がわかりません。

dateに従ってタグをソートするスクリプト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からは到達できるがタグからは到達できない回転数に従ってタグをソートするスクリプト:

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

プロジェクトの履歴にコミットの奇妙な日付がある場合(リベースまたは別の履歴の書き換えまたはバロンがBIOSバッテリーまたは履歴で行う他の魔法の交換を忘れているため)上記のスクリプトを使用します。

日付でソートされたタグのリストを取得する最後のオプション(マージベースに関係なくタグのdateの場合:

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

既知の現在の改訂日付を取得するには、次を使用します。

$ git log --max-count=1

git describe --tagsは独自のケースで使用されますが、プロジェクト履歴で人間が期待する最も近いタグを見つけるためではありません。

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

12
gavenkoa
git tag -l ac* | tail -n1

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

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

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

より詳しい情報

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

git tag -l <pattern>

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


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

更新

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

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

グーグルの後、 誰かが言った git 2.8.0サポート以下の構文。

git tag --sort=committerdate
10
AechoLiu

git describe --abbrev=0 --tags

最新のタグが表示されていない場合は、それを実行する前に必ずOriginを取得してください。

git remote update

9
Walter B

最後の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魔法使いではないので、私はそれがさらに改善されることができると確信しています。また、コミット履歴が進んでしまった場合には失敗すると思います。誰かに役立つことを念頭に置いて共有しています.

5
Ivan Vučica

特定のブランチに適用された最後のタグを見つけたい場合は、以下を試してください。

git describe --tag $(git rev-parse --verify refs/remotes/Origin/"branch_name")
3
Scyssion

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

3
Greg Hewgill

これは古いスレッドですが、多くの人がOPの質問に対する最も簡単で、最も簡単で正しい答えを見逃しているようです:現在のブランチの最新のタグを取得するにはgit describe HEADを使います。完了しました。

編集:あなたはまた、リモートでも、任意の有効なrefnameを供給することができます。つまりgit describe Origin/masterはOrigin/masterから到達できる最新のタグを教えてくれます。

1
dohpaz42

タグが並べ替え可能な場合

git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1
0
Clintm

尋ねられた質問については、

現在のブランチで最新のタグ名を取得する方法

あなたが欲しい

git log --first-parent --pretty=%d | grep -m1 tag:

--first-parentgit logにマージされた履歴を詳述しないように指示し、--pretty=%dは装飾、つまりコミットのローカル名のみを表示するように指示します。 grep -m1は「1つだけ一致」と言うので、最新のタグのみを取得します。

0
jthill

現在のブランチの前に置かれている現在のブランチ/タグ名のみで最新のタグを取得するには、以下を実行する必要がありました。

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags --abbrev=0 $BRANCH^ | grep $BRANCH

ブランチマスター:

git checkout master

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags 
--abbrev=0 $BRANCH^ | grep $BRANCH

master-1448

Branch custom:

git checkout 9.4

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags 
--abbrev=0 $BRANCH^ | grep $BRANCH

9.4-6

そして私の最後の必要性は次のタグ付けのためにタグを+1することです。

BRANCH=`git rev-parse --abbrev-ref HEAD` && git describe --tags  --abbrev=0 $BRANCH^ | grep $BRANCH | awk -F- '{print $NF}'
0
147.3k

現在のブランチ最新のタグ名(タグの日付による)を取得する1つのライナーが必要な場合:

git for-each-ref refs/tags --sort=-taggerdate --format=%(refname:short) --count=1 --points-at=HEAD

これを使用して、セットアップでバージョン番号を設定します。

出力例:

v1.0.0

Windowsでも動作します。

0
Shivan