【问题标题】:show all tags in git log显示 git log 中的所有标签
【发布时间】:2010-11-18 04:07:49
【问题描述】:

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

编辑:查尔斯·贝利(Charles Bailey)提出了答案(至少在我的情况下)
本质上,我有一个标签指向另一个指向提交的标签。由于这个额外的间接层,标签没有出现在日志中。我必须解决这个问题,通过修复我们的标记脚本来正确标记,或者通过一些 shell 脚本 voodoo 来递归地跟踪标记。无论如何,我会留下这个问题以供参考,以防有人想要它。 (我是堆栈溢出的新手,但我认为这是正确的协议?)

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

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

所以实际上我们经常在同一个提交上有多个标签。能够在文本日志中看到这将是非常好的,但它似乎不支持它。我目前正在通过手动检查我正在寻找的标签或启动gitk 来解决这个问题。虽然这两种解决方案都有效,但在我看来 git log --decorate 默认每次提交只支持一个标签真的很奇怪。

我做了一些谷歌搜索,但没有找到太多。我错过了什么明显的东西吗?

附注(我实际上使用%d 的自定义格式字符串,根据手册页和一些快速测试,它相当于--decorate

【问题讨论】:

  • 你试过'git log --decorate=full'(减去引号)吗?
  • 你用的是什么版本的git?我看到多个标签都很好。
  • @RDL: full 让它根据需要打印 refs/heads/ 或 refs/tags/ ,对吧?没有更多或更少的参考。
  • 快速提问,你是标记标签,还是标记提交? (标签可以形成链,在我的测试中,decorate 查看了指向提交的标签和指向提交标签的标签,但仅此而已。)
  • @Charles Bailey 我想你可能已经找到了问题所在。我在工作中尝试了一个简单的测试(git 版本 1.6.3.3),它似乎工作正常。所以不是版本问题。稍后我会进行更多调查。感谢您的洞察力!

标签: git


【解决方案1】:
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.

【讨论】:

  • 为它创建一个别名更好:) git config --global alias.tags "!git log --no-walk --tags --pretty='%h %d %s' - -decorate=full"
  • 感谢@GOXR3PLUS。我必须这样做: git config --global alias.tags "log --no-walk --tags --pretty='%h %d %s' --decorate=full"
  • 我真的很想看到颜色输出,并从git log 信息中查看更多详细信息,所以我添加了my own answer with how to do so here
【解决方案2】:

注意:我只是针对问题的主题

在 git 日志中显示所有标签

...不是问题的具体细节。

为每个标记的提交显示完整的git log(彩色!):

我真的认为这是最有用最漂亮的形式:

git log --no-walk --tags

它为每个附加了标签的提交显示完整的git log 输出。很方便!

如果您只想过滤掉与特定字符串搜索模式匹配的标签,请改为:

git log --no-walk --tags=*some_string*

例子:

git log --no-walk --tags=*release/my_board*

为每个标记的提交显示一个 1 行 git log 总结(彩色!):

如果您希望每次标记提交只看到一行,请改为执行此操作。注意:这是从Coderwall's beautiful git lg alias修改而来的:

git log --color --no-walk --tags --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

当然,您仍然可以使用--tags=*some_string* 表单来过滤您想要的某些标签:

git log --color --no-walk --tags=*some_string* --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

例子:

git log --color --no-walk --tags=*release/my_board* --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

参考资料:

  1. answer by @Marcello de Sales 帮助我入门。
  2. Coderwall's beautiful git lg alias

【讨论】:

    【解决方案3】:

    注意:brian m. carlson (bk2204) 中的 commit 5e1361c(适用于 git 1.9/2.0 Q1 2014)处理带有标签的日志装饰方面的特殊情况:

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

    git log 在标签对象引用另一个不再是 ref 的标签对象时(例如删除第二个标签时)没有正确处理修饰
    提交不会被正确修饰,因为 parse_object 没有在第二个标签上被调用,因此它的 tagged 字段没有被填写,导致没有任何标签与相关提交相关联。

    如果此字段不存在,请调用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
    

    【讨论】:

      【解决方案4】:

      注意标签的标签(标记标签),这是您问题的根源,正如Charles Bailey 在评论中正确指出的那样:

      确保你学习this thread,因为覆盖签名标签并不容易:

      • 如果您已经推送了标签,git tag man page 严重建议不要使用简单的git tag -f B 来替换标签名称“A
      • 不要尝试使用git tag -f 重新创建签名标签(请参阅下面的线程摘录)

        (这是关于一个极端案例,但总体上对标签很有启发性,它来自另一个 SO 贡献者Jakub Narębski):

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

      • 在标记对象本身中作为“标记”标头的内容(您可以在“git show &lt;tag&gt;”的输出和“git cat-file -p &lt;tag&gt;”的输出中看到它,其中&lt;tag&gt; 是重量级标记,例如@ 987654332@ 在git.git 存储库中),
      • 也是指向标签对象的标签引用的默认名称(在“refs/tags/*”命名空间中的引用)。
        请注意,标签 reference(“refs/tags/*”命名空间中的适当引用)纯粹是 local 问题;例如,一个存储库在“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选项用于强制标注标签(创建标签对象),会得到如下情况

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

      还要注意“git show A”会显示整个链到非标签对象...

      【讨论】:

        猜你喜欢
        • 2020-06-01
        • 2013-02-05
        • 2021-04-29
        • 1970-01-01
        • 2022-11-10
        • 1970-01-01
        • 2015-04-02
        • 2019-12-02
        • 2021-03-02
        相关资源
        最近更新 更多