Git で最新のタグを取得する最も簡単な方法は何ですか?
git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag
出力:
a
b
c
各タグの日時を取得して比較するスクリプトを作成する必要がありますか?
Git で最新のタグを取得する最も簡単な方法は何ですか?
git tag a HEAD
git tag b HEAD^^
git tag c HEAD^
git tag
出力:
a
b
c
各タグの日時を取得して比較するスクリプトを作成する必要がありますか?
最新のタグを取得するには (その後の出力例):
git describe --tags --abbrev=0 # 0.1.0-dev
タグ付けされたオブジェクトの上に追加されたコミットの数などを使用して、最新のタグを取得するには:
git describe --tags # 0.1.0-dev-93-g1416689
最新の注釈付きタグを取得するには:
git describe --abbrev=0
あなたがgit describe
求めていることに近いことをする を見てください。
すべてのブランチで最新のタグ付きコミットのタグを出力します
git describe --tags $(git rev-list --tags --max-count=1)
これはどう?
TAG=$(git describe $(git rev-list --tags --max-count=1))
技術的には、必ずしも最新のタグを取得するとは限りませんが、タグ付けされた最新のコミットは、探しているものである場合とそうでない場合があります。
「最新」には、git に関して 2 つの意味があります。
「どのタグの作成日が最も遅いか」という意味であり、ここでの回答のほとんどはその質問に対するものです。あなたの質問に関しては、 tag を返したいと思うでしょうc
。
または、「開発履歴で名前付きブランチに最も近いタグはどれか」という意味でもかまいません。通常は、あなたがいるブランチですHEAD
。あなたの質問では、これは tag を返しa
ます。
もちろん、これらは異なる場合があります。
A->B->C->D->E->F (HEAD)
\ \
\ X->Y->Z (v0.2)
P->Q (v0.1)
開発者が月曜日にタグ付けZ
され、火曜日にタグ付けされたと想像してください。 は最近のものですが、開発の歴史では HEAD に近く、その道筋は HEAD に近い点から始まります。v0.2
Q
v0.1
v0.1
v0.2
通常、この 2 番目の回答は、開発履歴に近い方がよいと思います。git log v0.2..HEAD
各タグに etc を使用すると、それを見つけることができます。これにより、 で終わるv0.2
パスが HEAD が続くパスから分岐してからの HEAD でのコミットの数がわかります。
このチェックを実行しているすべてのタグを反復処理し、タグ パスが分岐してから HEAD でのコミットが最も少ないタグを出力する Python スクリプトを次に示します。
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 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) を参照してください。
Google の後、誰かがgit 2.8.0 は次の構文をサポートすると言いました。
git tag --sort=committerdate
すべての提案 (この回答投稿の最新のMatthew Brettの説明 を除く) の何が問題になっていますか?
履歴の別の時点で、jQuery Git 履歴で他の人が提供するコマンドを実行し、視覚的なタグ付け履歴表現で結果を確認するだけです(私が行ったので、この投稿が表示されます)。
$ git log --graph --all --decorate --oneline --simplify-by-decoration
今日の多くのプロジェクトは、メインラインとは別のブランチでリリース (およびタグ付け) を実行しています。
これには強い理由があります。十分に確立された JS/CSS プロジェクトを見てください。ユーザー規約のために、DVCS でバイナリ/縮小リリース ファイルを運びます。当然のことながら、プロジェクトのメンテナーとして、役に立たないバイナリ BLOB でメインラインの差分履歴を破棄したり、メインラインからビルド アーティファクトのコミットを実行したりしたくありません。
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 からは到達できるがタグからは到達できないrev の数に従ってタグをソートするスクリプト:
$ 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
ます。必要なものに置き換えるだけです!
最後の 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
。空でないリストを生成する ref を見つけると、git tag --contains
最新のタグが見つかりました。
特定のブランチに適用された最後のタグを見つけたい場合は、次のことを試すことができます。
git describe --tag $(git rev-parse --verify refs/remotes/origin/"branch_name")