git logにすべてのタグを表示する


98

git log --decorateコミットごとに複数のタグを表示しないのはなぜですか?

編集:Charles Baileyが答えを出しました(少なくとも私の場合)。
本質的に、コミットを指す別のタグを指すタグが1つありました。この追加の間接層のため、タグはログに表示されませんでした。これを修正する必要があります。タグ付けスクリプトを修正して正しくタグ付けするか、シェルスクリプトのブードゥー教によってタグを再帰的に追跡します。とにかく、この質問は、誰かが望んだ場合に備えて参照用に残しておきます。(私はスタックオーバーフローは初めてですが、それが正しいプロトコルだと思いますか?)

...元の質問が続きます...

バックストーリー:私たちはソースコントロールに仕事でGITを使用しており、デプロイするときに常にコミットにタグを付けるというポリシーがあります。(実際にはタグを実行し、サーバー上でタグをプルするスクリプトです)。これは、ステージングサーバーと本番サーバーが別々のWebアプリケーションであるため、リリースにステージングのタグを付け(テストなど)、その後、同じコミットに本番タグを付けます。

そのため、実際には、同じコミットに複数のタグがあることがよくあります。これをテキストログで確認できると便利ですが、サポートされていないようです。私は現在、探しているタグを手動で確認するか、を起動することで問題を回避していgitkます。これらのソリューションはどちらも機能git log --decorateしますが、デフォルトではコミットごとに1つのタグのみをサポートするのは本当に奇妙なようです。

私はぐるぐる回りましたが、あまり見つかりませんでした。私は明白な何かを見逃していますか?

PS(私は実際にでカスタム書式文字列を使用しています。%dマニュアルページといくつかの簡単なテストによると、これはと同等です--decorate


12
'git log --decorate = full'(引用符を除いたもの)を試しましたか?
RDL 2010年

1
使用しているgitのバージョンは何ですか?私は複数のタグをうまく見ています。
Cascabel 2010年

@RDL:フルにすると、refs / heads /またはrefs / tags /が適切に印刷されますか?参照が多かれ少なかれありません。
Cascabel 2010年

9
簡単な質問ですが、タグにタグを付けますか、それともコミットにタグを付けますか?(タグはチェーンを形成する可能性があります。私のテストでは、コミットを指すタグと、コミットを指すタグを指すタグを装飾しますが、それ以上はありません。)
CBベイリー

1
@チャールズベイリー私はあなたが問題を見つけたかもしれないと思います。簡単なテスト(gitバージョン1.6.3.3)を試しましたが、問題なく動作するようです。したがって、バージョンの問題ではありません。後で詳しく調べます。洞察をありがとう!
ジョナサン

回答:


17

Charles Baileyがコメントで正しく指摘しているように、問題の原因となっているタグのタグ(タグのタグ付け)について注意してください。

署名されたタグを上書きするのは簡単ではないので、このスレッドを必ず確認してください。

  • すでにタグをプッシュしている場合、タグ名「」を置き換える単純なものに対して、git tagmanページは真剣にアドバイスしましたgit tag -f BA
  • で署名済みタグを再作成しようとしないでくださいgit tag -f(以下のスレッドの抜粋を参照)

    (これはコーナーケースに関するものですが、一般的にタグについて非常に有益であり、それは別のSO貢献者JakubNarębskiから来ています):

タグの名前(重いタグ、つまりタグオブジェクト)は2つの場所に格納されていることに注意してください。

  • 「タグ」ヘッダーのコンテンツとしてのタグオブジェクト自体(「git show <tag>」の出力と「git cat-file -p <tag>」の出力にも表示されます<tag>。たとえばv1.6.3git.gitリポジトリ内の重量タグです)、
  • またrefs/tags/*、タグオブジェクトを指すタグ参照( " "ネームスペース内の参照)のデフォルト名です。
    タグ参照( " refs/tags/*"名前空間の適切な参照)は、純粋にローカルな問題です。たとえばrefs/tags/v0.1.3、あるリポジトリが ' 'にあるもの、他のリポジトリが' refs/tags/sub/v0.1.3'にあるものなどです。

したがって、署名付きタグ「A」を作成すると、次の状況になります(あるコミットを指していると想定)

  35805ce   <--- 5b7b4ead  <=== refs/tags/A
  (commit)       tag A
                 (tag)

また、「git tag -f A A」(注釈付きタグを強制するオプションがないことに注意)は何もしないことに注意してください。状況は変わりません。

git tag -f -s A A」を実行する場合:タグの書き込みを強制し(そのため、gitは何をしているのかを知っていると想定します)、注釈付きタグ(タグオブジェクトの作成)を強制するために-s/ -a/ -mオプションの1つを使用することに注意してください。次の状況

  35805ce   <--- 5b7b4ea  <--- ada8ddc  <=== refs/tags/A
  (commit)       tag A         tag A
                 (tag)         (tag)

また、「git show A」を指定すると、非タグオブジェクトまでのチェーン全体が表示されます...


86
git log --no-walk --tags --pretty="%h %d %s" --decorate=full

このバージョンでは、コミットメッセージも出力されます。

 $ git log --no-walk --tags --pretty="%h %d %s" --decorate=full
3713f3f  (tag: refs/tags/1.0.0, tag: refs/tags/0.6.0, refs/remotes/origin/master, refs/heads/master) SP-144/ISP-177: Updating the package.json with 0.6.0 version and the README.md.
00a3762  (tag: refs/tags/0.5.0) ISP-144/ISP-205: Update logger to save files with optional port number if defined/passed: Version 0.5.0
d8db998  (tag: refs/tags/0.4.2) ISP-141/ISP-184/ISP-187: Fixing the bug when loading the app with Gulp and Grunt for 0.4.2
3652484  (tag: refs/tags/0.4.1) ISP-141/ISP-184: Missing the package.json and README.md updates with the 0.4.1 version
c55eee7  (tag: refs/tags/0.4.0) ISP-141/ISP-184/ISP-187: Updating the README.md file with the latest 1.3.0 version.
6963d0b  (tag: refs/tags/0.3.0) ISP-141/ISP-184: Add support for custom serializers: README update
4afdbbe  (tag: refs/tags/0.2.0) ISP-141/ISP-143/ISP-144: Fixing a bug with the creation of the logs
e1513f1  (tag: refs/tags/0.1.0) ISP-141/ISP-143: Betterr refactoring of the Loggers, no dependencies, self-configuration for missing settings.

2
そのためのエイリアスをさらに作成する:) git config --global alias.tags "!git log --no-walk --tags --pretty = '%h%d%s' --decorate = full"
GOXR3PLUS

1
@ GOXR3PLUSに感謝します。私はしなければなりませんでした:git config --global alias.tags "log --no-walk --tags --pretty = '%h%d%s' --decorate = full"
ajh158

8

注:brian mからのコミット5e1361c 。carlson(bk2204(2014年第1四半期の1.9 / 2.0の場合)は、タグ付きのログ装飾に関する特別なケースを扱います。

ログ:チェーンタグで装飾を適切に処理する

git log2番目のタグが削除された場合など、タグオブジェクトが参照ではなくなった別のタグオブジェクトを参照した場合、は装飾を正しく処理しませんでした。2番目のタグで呼び出されなかったため、タグ付けされたフィールドに入力されなかったため、
コミットが正しく装飾parse_objectされず、関連するコミットにタグが関連付けられていませんでした。

コールはparse_object、タグのチェーンを逆参照することができ、適切に装飾することができるコミットので、存在しない場合、このフィールドに入力します。
今後のリグレッションを防ぐためにテストも含めます。

例:

git tag -a tag1 -m tag1 &&
git tag -a tag2 -m tag2 tag1 &&
git tag -d tag1 &&
git commit --amend -m shorter &&
git log --no-walk --tags --pretty="%H %d" --decorate=full
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.