Git の現在のブランチで最新のタグ名を取得するにはどうすればよいですか?
-
05-07-2019 - |
質問
Git で最新のタグを取得する最も簡単な方法は何ですか?
git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag
出力:
a
b
c
各タグの日時を取得して比較するスクリプトを作成する必要がありますか?
解決
git describe
を見ることができます。これは、あなたが求めていることに近い何かをします。
他のヒント
最新のタグを取得するには:
git describe --tags
最新の注釈付きタグを取得するには:
git describe --abbrev=0
すべてのブランチにわたって最新のタグ付きコミットのタグを出力します
git describe --tags $(git rev-list --tags --max-count=1)
最新のタグを取得するには、次のようにします。
$ git for-each-ref refs/tags --sort=-taggerdate --format='%(refname)' --count=1
もちろん、必要に応じてcount引数またはsortフィールドを変更できます。現れる あなたはわずかに異なる質問をするつもりだったかもしれないが、これは私がそれを解釈するときに質問に答えます。
これはどうですか?
TAG = $(git describe $(git rev-list --tags --max-count = 1))
技術的には、必ずしも最新のタグを取得する必要はありませんが、タグ付けされた最新のコミットは、あなたが探しているものである場合とそうでない場合があります。
git describe --tags
現在のブランチで見ることができる最後のタグを返します
"最新のもの" gitに関して2つの意味を持つことができます。
「どのタグに作成日時が最も遅いか」という意味がありますが、ここでの回答のほとんどはその質問に対するものです。質問に関しては、タグ c
を返します。
または「どのタグが開発履歴で名前付きブランチに最も近いか」を意味することもできます。通常は、あなたがいるブランチ HEAD
です。あなたの質問では、これはタグ a
を返します。
これらはもちろん異なる場合があります:
A->B->C->D->E->F (HEAD)
\ \
\ X->Y->Z (v0.2)
P->Q (v0.1)
開発者が月曜日に Z
を v0.2
としてタグ付けし、次に Q
を v0としてタグ付けしたとします。火曜日に1
。 v0.1
はより新しいですが、 v0.2
は開発履歴でHEADに近いため、そのパスはHEADに近いポイントから始まるという意味で。
通常、この2番目の答えは、開発履歴により近いものだと思います。タグごとに git log v0.2..HEAD
などを使用して、それを見つけることができます。これにより、 v0.2
で終わるパスがHEADが続くパスとは異なるため、HEADでのコミット数がわかります。
次のPythonスクリプトは、このチェックを実行するすべてのタグを繰り返し処理し、タグパスが分岐してからHEADへのコミットが最も少ないタグを出力します。
https://github.com/MacPython/terryfy/blob/master/git-closest -tag
git describe
は、HEADから追跡して(たとえば)HEADから履歴に戻るパスにある最初のタグを見つけるという点で、少し異なることを行います。 gitの用語では、 git describe
は「到達可能」なタグを探します。 HEADから。したがって、HEADから戻るパス上ではなく、そこから分岐したパス上にある v0.2
のようなタグは検出されません。
実行できます: git describe --tags $(git rev-list --tags --max-count = 1)
はここで話しました:最新のタグ名を取得する方法
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」を変更してください。 「5qのsed」へまたはあなたが必要なもの
その後、すべてのタグ名を変数などに簡単に解析できます。
間違っているとすべての提案( Matthew Brett の説明を除く、最新のこの回答の投稿)?
異なる時点にいるときにjQuery Gitの履歴で他のコマンドを実行し、視覚的なタグ付け履歴表現で結果を確認するだけです(I d そのため、この投稿が表示されます):
$ git log --graph --all --decorate --oneline --simplify-by-decoration
今日、多くのプロジェクトがリリース(およびタグ付け)をメインラインとは別のブランチで実行しています。
これには強い理由があります。確立されたJS / CSSプロジェクトに注目してください。ユーザー規約のために、彼らはDVCSでバイナリ/縮小リリースファイルを運びます。プロジェクトメンテナーとして、メインラインの diff 履歴を無駄なバイナリBLOBでガベージし、ビルドアーティファクトのコミットをメインライン外にしたくないのは当然です。
Gitは線形履歴ではなくDAGを使用するため、距離メトリックを定義するのは難しいため、言うことができます-revは私の HEAD
に最も近い!
自分の旅を始めます(中を見て、この長い投稿に派手な証拠画像をコピーしませんでした):
最も近いものGitでの分岐に関して過去にタグを付けましたか?
現在、タグとリビジョン間の距離について、有用性が低下する4つの合理的な定義があります。
-
HEAD
からベースとマージタグまでの最短パスの長さ - 日付
- HEADからは到達できるがタグからは到達できない回転数
- マージベース に関係なく、タグの
- 日付
HEAD
とタグの間のマージベースの最短パスの長さの計算方法がわかりません。
HEAD
とタグの間の merge base の日付に従ってタグをソートするスクリプト:
$ 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バッテリーまたは履歴で行う他の魔法の交換を忘れているため)上記のスクリプトを使用します。
日付の使用順にソートされたタグのリストを取得するための最後のオプション(ベースのマージに関係なくタグの日付):
$ git log --tags --simplify-by-decoration --pretty="format:%ci %d" | sort -r
既知の現在の改訂日付を取得するには、次を使用します。
$ git log --max-count=1
git describe --tags
は独自のケースで使用しますが、プロジェクト履歴で人間が予想する最も近いタグを見つけるためではありません
注上記のレシピはどのリビジョンでも使用できます。 HEAD
を必要なものに置き換えるだけです!
git tag -l ac* | tail -n1
プレフィックス付きの最後のタグを取得します "交流". 。たとえば、次のような名前のタグ ac1.0.0
, 、 または ac1.0.5
. 。他の名前のタグ 1.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タグ」を実行すると、すべてのタグもリストされています。パターンはシェルワイルドカードです(つまり、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
git describe --abbrev = 0 --tags
最新のタグが表示されない場合は、実行する前にオリジンを取得してください:
git remote update
最後の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ウィザードではないので、さらに改善できると確信しています。また、コミット履歴が前に進むと破損するのではないかと思います。誰かに役立つ場合に備えて共有しています。
最初に考えたのは、 gitタグ--contains
と組み合わせて、すべてのリビジョンを新しい順にリストする git rev-list HEAD
を使用できることです。 git tag --contains
が空でないリストを生成する参照を見つけると、最新のタグが見つかりました。
特定のブランチに適用された最後のタグを検索する場合は、次を試してください:
git describe --tag $(git rev-parse --verify refs/remotes/origin/"branch_name")
これは古いスレッドですが、多くの人がOPの質問に対する最も簡単で簡単で最も正しい答えを見逃しているようです:現在のブランチの最新のタグを取得するには、 git describe HEAD
。完了。
編集:任意の有効なrefnameを、リモートでも指定できます。つまり、 git describe origin / master
は、origin / masterから到達できる最新のタグを通知します。
現在のブランチの前にある現在のブランチ/タグ名でのみ最新のタグを取得するには、次を実行する必要がありました
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
ブランチカスタム:
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}'
尋ねられた質問については、
現在のブランチで最新のタグ名を取得する方法
欲しい
git log --first-parent --pretty=%d | grep -m1 tag:
-first-parent
は git log
にマージされた履歴を詳述しないように指示し、-pretty =%d
はデコレーション、つまりコミットのローカル名。 grep -m1
は「1つだけ一致」と表示されるため、最新のタグのみが取得されます。
タグがソート可能な場合:
git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1