回答:
を見てみgit describe
ましょう。これは、あなたが求めていることに近いものを実行します。
--abbrev=0
、最も近い注釈付きタグが返されます
git describe --exact-match --abbrev=0
。
git describe --tags
そしてgithubリリースページのcom最後のタグを比較します
最新のタグを取得するには:
git describe --tags
最新の注釈付きタグを取得するには:
git describe --abbrev=0
git describe
言うように --abbrev=<n> [...] An <n> of 0 will suppress long format, only showing the closest tag.
git describe --tags
git checkout $(git describe --abbrev=0 --tags)
すべてのブランチにわたって最新のタグ付きコミットのタグを出力します
git describe --tags $(git rev-list --tags --max-count=1)
TAG=$(git describe --tags $(git rev-list --tags --max-count=1))
@ william-pursell
最新のタグを取得するには、次のようにします。
$ git for-each-ref refs / tags --sort = -taggerdate --format = '%(refname)' --count = 1
もちろん、必要に応じてcount引数またはsortフィールドを変更できます。少し違う質問をするつもりだったようですが、私が解釈すると、これは質問の答えになります。
--sort=-authordate
と--sort=authordate
。
--sort=-taggerdate
。タグの場合authordate
、committerdate
空です(したがって、ソートキーとしては役に立ちません)。
git for-each-ref refs/tags --sort=-taggerdate --format='%(refname:short)' --count=1
より良いです:)
--points-at=$SHA
、コミットハッシュのタグを提供します。
これはどう?
TAG=$(git describe $(git rev-list --tags --max-count=1))
技術的には、必ずしも最新のタグを取得するわけではありませんが、タグ付けされている最新のコミットを取得します。
--tags=<pattern>
の中でrev-list
。たとえば、最新バージョンのタグを取得git describe --tags $(git rev-list --tags='v[0-9].[0-9]*' --max-count=1)
git describe --tags $(git rev-list --tags --max-count=1)
あなたは実行することができgit describe --tags $(git rev-list --tags --max-count=1)
ます:ここで話しました:最新のタグ名を取得する方法?
git describe ...
は以前のタグを返します!)
--abbrev=0
回答を試しましたが、彼らは私が欲しいタグの一部を切り取りました。
「最新」には、gitに関して2つの意味があります。
「どのタグに作成日が最も遅いか」ということで、ここでの答えのほとんどはその質問に対するものです。あなたの質問の点では、あなたはタグを返したいでしょうc
。
または、「どのタグが開発履歴で名前付きブランチに最も近いか」、通常は自分がいるブランチを意味するかもしれませんHEAD
。あなたの質問では、これはtagを返しa
ます。
もちろん、これらは異なる場合があります。
A->B->C->D->E->F (HEAD)
\ \
\ X->Y->Z (v0.2)
P->Q (v0.1)
月曜日にタグが付けられ、火曜日にタグが付けZ
られた開発者を想像してください。 はより最近ですが、開発履歴ではHEADに近いパスから始まります。v0.2
Q
v0.1
v0.1
v0.2
私は通常、開発の歴史により近いこの2番目の答えを求めていると思います。git log v0.2..HEAD
タグごとにetcを使用することでそれを見つけることができます。これによりv0.2
、パスがHEADが続くパスから分岐して終了するため、HEADでのコミット数がわかります。
次のPythonスクリプトは、このチェックを実行するすべてのタグを繰り返し処理し、タグパスが分岐してからHEADでのコミットが最も少ないタグを出力します。
https://github.com/MacPython/terryfy/blob/master/git-closest-tag
git describe
HEADから履歴に戻ってパス上にある最初のタグを見つけるために(たとえば)HEADから逆に追跡するという点で、少し異なることを行います。git用語でgit describe
は、HEADから「到達可能」なタグを探します。したがって、このようなタグv0.2
は、HEADから戻るパスではなく、そこから分岐したパスにはありません。
git describe --tags
現在のブランチで見ることができる最後のタグを返します
git log --tags --no-walk --pretty="format:%d" | sed 2q | sed 's/[()]//g' | sed s/,[^,]*$// | sed 's ...... '
最後のタグが複数必要な場合
(git describe --tagsが間違ったハッシュを返すことがありますが、理由はわかりませんが、私にとって--max-count 2は機能しません)
これは、最新の2つのタグ名のリストを新しい順に取得する方法です。git1.8.4で完全に動作します。以前のバージョンのgit(1.7。*など)では、出力に「tag:」文字列はありません-最後のsed呼び出しを削除するだけです
2つ以上の最新のタグが必要な場合-この「sed 2q」を「sed 5q」または必要なものに変更します
その後、すべてのタグ名を変数などに簡単に解析できます。
git log --tags --no-walk --pretty="format:%D" | sed -nr '5q;s;^.*(tag: )([^,]*).*;\2;p'
ここで、in %D
は周囲の()
文字を除外し、sed
5qで始まるsは5の前に4行を残し、次に 'tag: `と最初の'、 'の間のすべての文字を出力します。したがって、タグ内でコンマが使用されていないと仮定すると、これは完全に機能します。
すべての提案の何が問題になっていますか(Matthew Brettの説明、この回答投稿の最新のものを除く)?
履歴の別のポイントで他の人が提供したコマンドをjQuery Git履歴で実行し、視覚的なタグ付け履歴表現で結果を確認するだけです(私がそうしたのがこの投稿を表示する理由です)。
$ git log --graph --all --decorate --oneline --simplify-by-decoration
今日、多くのプロジェクトはmainlineとは別のブランチでリリース(およびタグ付け)を実行しています。
これには大きな理由があります。十分に確立されたJS / CSSプロジェクトを見てください。ユーザー規約では、DVCSでバイナリ/縮小リリースファイルを保持しています。当然のことながら、プロジェクトのメンテナとしてあなたはゴミにあなたのメインラインたくない差分役に立たないバイナリ・ブロブと歴史を、ビルド成果物のコミットを実行メインラインの外へ。
Gitは線形履歴ではなくDAGを使用するため、距離メトリックを定義するのは難しい ため、次のように言うことができますHEAD
。
私は自分の旅を始めます(中を見て、私はこの長い投稿に派手な証明画像をコピーしませんでした):
現在、私はタグとリビジョンの間の距離の4つの合理的な定義を持っています。
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からは到達可能であるがタグからは到達できない回転数に従ってタグをソートするスクリプト:
$ git tag \
| while read t; do echo `git rev-list --count $t..HEAD` $t; done \
| sort -n
プロジェクトの履歴がコミット時に奇妙な日付を持っている場合(リベースまたは別の履歴の書き換え、または一部のmoronが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
接頭辞"ac"が付いた最後のタグを取得します。たとえば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 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
最後の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 rev-list HEAD
、と組み合わせて、すべてのリビジョンを新しい順にリストしたを使用できるということgit tag --contains
です。git tag --contains
空でないリストを生成するrefを見つけたら、最新のタグを見つけました。
現在のブランチで最新のタグ名(タグの日付によって)を取得する1つのライナーが必要な場合:
git for-each-ref refs/tags --sort=-taggerdate --format=%(refname:short) --count=1 --points-at=HEAD
これを使用して、セットアップでバージョン番号を設定します。
出力例:
v1.0.0
Windowsでも動作します。
-bash: syntax error near unexpected token '('
--format="%(refname:short)"
)で囲み、スキップする--points-at=HEAD
と機能します。最後のスイッチでは何も返されませHEAD
ん。タグ付けされていないためでしょうか?
HEAD
タグが付いていないからだと思います。
これは古いスレッドですが、多くの人がOPの質問に対する最も単純で最も簡単な最も正しい答えを見落としているようです。現在のブランチの最新のタグを取得するには、を使用しますgit describe HEAD
。できました。
編集:リモートであっても、有効な参照名を指定できます。つまり、git describe origin/master
origin / masterから到達できる最新のタグを教えてくれます。
for-each-ref
コマンド(stackoverflow.com/a/5261470/515973)との組み合わせrev-list
及びdescribe
(stackoverflow.com/a/7979255/515973)
git describe branchname --tags
ブランチ(gitバージョン2.12.2)で最新のタグを取得するために機能します
現在のブランチの前にある現在のブランチ/タグ名でのみ最新のタグを取得するには、次を実行する必要がありました
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}'
ここでは、注釈なしタグと注釈付きタグについてあまり言及していません。'describe'は注釈付きタグで機能し、注釈なしタグを無視します。
これは醜いですが、要求されたジョブを実行し、他のブランチ(およびコマンドで指定されたブランチではなく、以下の例ではマスター)でタグを検出しません。
フィルタリングは最適化(統合)する必要がありますが、これも仕事のようです。
git log --decorate --tags master |grep '^commit'|grep 'tag:.*)$'|awk '{print $NF}'|sed 's/)$//'|head -n 1
私はこれを使用するつもりですので、批評は歓迎します:)