在git log中显示所有标签


98

为什么git log --decorate每次提交不显示多个标签?

编辑:Charles Bailey提出了答案(至少在我的情况下)
本质上,我有一个标记指向另一个标记,该标记指向提交。由于存在额外的间接层,因此该标记未显示在日志中。我必须修复此问题,方法是修复我们的标记脚本以正确标记,或者通过一些shell脚本voodoo递归地遵循标记。无论如何,如果有人需要,我将保留此问题以供参考。(我是堆栈溢出的新手,但我认为这是正确的协议吗?)

...原始问题如下...

背景:我们在工作中使用GIT进行源代码控制,并且我们有一个始终在部署时标记提交的策略。(它实际上是一个执行标签的脚本,然后将标签拉到服务器上)。由于它是一个具有单独的登台服务器和生产服务器的Web应用程序,因此我们通常将发行版标记为登台(用于测试或进行其他操作),然后再将同一提交标记为生产。

因此,实际上在同一提交上经常有多个标签。能够在文本日志中看到它会很好,但是似乎不支持它。我目前正在通过手动检查要查找的标签或启动来解决此问题gitk。虽然这两种解决方案都起作用,但在我看来git log --decorate,默认情况下每次提交仅支持一个标记确实很奇怪。

我做了一些谷歌搜索,但没有发现太多。我是否缺少明显的东西?

PS(%d根据手册页和一些快速测试,我实际上使用了带有的自定义格式字符串,它等效于--decorate


12
您是否尝试过'git log --decorate = full'(减引号)?
RDL 2010年

1
您正在使用什么版本的git?我看到多个标签恰好在我的手中。
卡斯卡贝尔

@RDL:已满,可以打印refs / heads /或refs / tags /,对吗?没有更多或更少的裁判。
卡斯卡贝尔

9
快速提问,您标记标签,还是标记提交?(标签可以形成链,在我的测试中,装饰着指向提交的标签和指向提交的标签的标签,但仅此而已。)
CB Bailey 2010年

1
@Charles Bailey我想您可能已找到问题所在。我在工作中尝试了一个简单的测试(git版本1.6.3.3),看来工作正常。因此,这不是版本问题。我待会再调查。感谢您的见解!
乔纳森

Answers:


17

查尔斯·贝利Charles Bailey)在评论中正确指出了有关标签标签(标记标签)的注意事项,这是问题的根源:

确保学习此线程,因为覆盖签名标记并不容易:

  • 如果您已经推送了标签,则 git tag手册页中建议不要简单git tag -f B地替换标签名称“ A
  • 不要尝试使用重新创建签名标签git tag -f(请参见下面的线程摘录)

    (这是一个极端的案例,但通常对标签很有启发性,它来自另一个SO贡献者 极端的 JakubNarębski):

请注意,标签的名称(重量标签,即标签对象)存储在两个位置:

  • 在标签对象本身中作为“标签”标头的内容(您可以在“ 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”(请注意,没有选项强制将其成为带注释的标签)是noop-不会改变情况。

如果您执行“ git tag -f -s A A”:请注意,您强制改写标签(因此git假设您知道自己在做什么),并且-s/ -a/ -m选项之一用于强制添加注释的标签(创建标签对象),您将获得以下情况

  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 。卡尔森(bk2204(对于git 1.9 / 2.0 2014年第一季度)处理带有标签的原木装饰方面的特殊情况:

日志:正确处理带有链接标签的装饰

git log当标签对象引用不再是ref的另一个标签对象时(例如删除第二个标签时),不能正确处理装饰
提交将无法正确修饰,因为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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.