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参照/タグ--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により近い歴史があります。
私はあなたがたいていあなたがこの第二の答えを望んでいると思う、開発の歴史においてもっと近い。各タグに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
のようなタグは見つかりませんが、そこから分岐したパスは見つかりません。
あなたが実行することができます: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」を「sed 5q」または必要なものに変更してください。
そうすれば、すべてのタグ名を変数などに簡単に解析できます。
すべての提案で間違っているとは何ですか( 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
に最も近いです!
私は自分の旅を始めます(中を見て、この長い投稿に豪華なプルーフの画像をコピーしませんでした):
現在、有用性を低下させながら、タグとリビジョンの間の距離の4つの合理的な定義があります。
HEAD
からタグとベースをマージHEAD
とタグの間のベースをマージします最短パスの長さの計算方法がわかりません。
の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
を必要なものに置き換えるだけです!
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>
指定されたパターン(またはパターンが指定されていない場合は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
git describe --abbrev=0 --tags
最新のタグが表示されていない場合は、それを実行する前に必ずOriginを取得してください。
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 describe --tag $(git rev-parse --verify refs/remotes/Origin/"branch_name")
私が最初に考えたのは、git rev-list HEAD
と組み合わせて、すべてのrevを逆順にリストするgit tag --contains
を使用できるということです。 git tag --contains
が空でないリストを生成するrefを見つけたとき、あなたは最新のタグを見つけました。
これは古いスレッドですが、多くの人がOPの質問に対する最も簡単で、最も簡単で正しい答えを見逃しているようです:現在のブランチの最新のタグを取得するにはgit describe HEAD
を使います。完了しました。
編集:あなたはまた、リモートでも、任意の有効なrefnameを供給することができます。つまりgit describe Origin/master
はOrigin/masterから到達できる最新のタグを教えてくれます。
タグが並べ替え可能な場合
git tag --merged $YOUR_BRANCH_NAME | grep "prefix/" | sort | tail -n 1
尋ねられた質問については、
現在のブランチで最新のタグ名を取得する方法
あなたが欲しい
git log --first-parent --pretty=%d | grep -m1 tag:
--first-parent
はgit log
にマージされた履歴を詳述しないように指示し、--pretty=%d
は装飾、つまりコミットのローカル名のみを表示するように指示します。 grep -m1
は「1つだけ一致」と言うので、最新のタグのみを取得します。
現在のブランチの前に置かれている現在のブランチ/タグ名のみで最新のタグを取得するには、以下を実行する必要がありました。
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}'
現在のブランチで最新のタグ名(タグの日付による)を取得する1つのライナーが必要な場合:
git for-each-ref refs/tags --sort=-taggerdate --format=%(refname:short) --count=1 --points-at=HEAD
これを使用して、セットアップでバージョン番号を設定します。
出力例:
v1.0.0
Windowsでも動作します。