web-dev-qa-db-ja.com

正規表現基準に一致する最後のGitタグを取得する方法

最後のバージョン付けコミットを取得するには、Gitコマンドでget/find last tag with with 'v'を取得する必要があります(次のアプリケーションバージョンをタグ付けするために、最初にv文字のタグを使用しています(例: v0.9.1beta)。

それを行う方法はありますか?

47
Lukasz

これには次のコマンドを使用しています。

git describe --match "v[0-9]*" --abbrev=4 HEAD

最後にバージョン管理されたタグ以降にソースツリーで何かを行った場合も、バージョンを変更します。

これはnot正規表現ですが、グロブですが、提供されている例では機能します。

51
KARASZI István
git tag -l -n v*
7
racerror

KARASZIIstvánの回答 は、globに一致するタグを見つける方法をすでに説明しています。ただし、本当のRegExが必要な場合:

for tag in $(git tag | grep YOURREGEX); do
    git describe --tags --long --match="$tag" 2>/dev/null
done | sort -k2 -t"-" | head -n1
  • 最も近いタグ(つまり、--abrev=0が達成すること)だけが必要な場合は、| cut -d"-" -f1を追加します
  • --long部分を含むexactlyマッチングタグも出力する-0-hashの動作が不要な場合は、| sed -e's/-0-.*$//'代わりに。

質問のタグの例では、おそらく正規表現^v\d+\.\d+\.\d+\D*$を使用します(\D*$はオプションの場合があります)。

4
Tobias Kienzler

また、git describeを使用すると、HEADから到達可能なだけでなく、

git describe --match "v*" --abbrev=0 --tags $(git rev-list --tags --max-count=1)

3
Barthelemy Pavy

ここでは単一の正規表現_--match "v[0-9]*"_で十分ですが、Git 2.13(2017年第2四半期)によって改善されることがわかっています。

" _git describe_ "および " _git name-rev_ "は、複数のrefnameパターンを使用して、参照のセットを制限し、それらの命名出力をベースにするように教えられていますオンになり、「_--exclude_」オプションを介した命名に使用されないように、参照に名前を付けるために否定的なパターンをとることを学びました。

commit 77d21f2commit 43f808commit 96415b4commit 290be66commit 4a68748 を参照してください(2017年1月18日) Jacob Keller(_jacob-keller_) による。
Junio C Hamano-gitster- によってマージ commit 1b32498 、2017年2月27日)

複数の一致パターン を持つことができます:

_--match <pattern>:
_

"refs/tags /"プレフィックスを除いて、指定されたglob(7)パターンに一致するタグのみを考慮します。
これは、リポジトリからプライベートタグが漏洩するのを防ぐために使用できます。

複数回指定すると、パターンのリストが蓄積され、パターンのいずれかに一致するタグが考慮されます。
パターンのリストをクリアしてリセットするには、_--no-match_を使用します。

そして、あなたは exclude pattern(またはいくつか)now も持っています!

_--exclude <pattern>::
_

「refs/tags /」接頭辞を除いて、指定されたglob(7)パターンに一致するタグを考慮しないでください。

これを使用して、タグスペースを狭め、いくつかの意味のある基準に一致するタグのみを見つけることができます。
複数回指定すると、パターンのリストが蓄積され、いずれかのパターンに一致するタグが除外されます。
_--match_と組み合わせると、タグは、少なくとも1つの_--match_パターンに一致し、どの_--exclude_パターンにも一致しない場合に考慮されます。
パターンのリストをクリアしてリセットするには、_--no-exclude_を使用します。

2
VonC
git describe --match v*

これを使って。

1
Lukasz

他の回答と同様にgit describeを使用する場合の問題は、git describeにHEAD(または指定したコミット)から到達可能なタグが表示されることです。)

V1、v2、v3の3つのタグがあるとします。 HEADがv2とv3の間のポイントにある場合、git describeはv3ではなくv2を返します。

実際に最新のタグが必要な場合は、軽量タグには日付メタデータがないため、最初に注釈付きタグが必要です。

次に、このコマンドはそれを行います:

git for-each-ref --sort=-taggerdate --count=1 refs/tags/v*

1
Joe Alcorn

私が使う

git tag -l --format "%(objecttype) %(refname:short)" --sort=-version:refname --merged HEAD "v*"

git tagは、パターンをグロブとして解釈します。したがって、完全な正規表現を指定することはできません。最小限のグロブ(v *)を使用するか、グロブをまったく使用しないでください。ソートされた順序で複数の一致するタグのみを受け取り(最も高いタグバージョンを最初に)、後で出力を正規表現することができます。

0
Henning