在git log中显示所有标签

时间:2010-11-18 04:07:49

标签: git

为什么git log --decorate每次提交不会显示多个代码?

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

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

Backstory:我们在工作中使用GIT进行源代码控制,我们的策略是在部署时始终标记提交。 (它实际上是一个执行标记的脚本,然后在服务器上提取标记)。由于它是一个带有单独的登台和生产服务器的Web应用程序,我们经常标记一个版本用于登台(用于测试或其他),然后标记相同的提交以进行生产。

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

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

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

3 个答案:

答案 0 :(得分:69)

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.

答案 1 :(得分:16)

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

确保您学习this thread,因为覆盖已签名的代码并不容易:

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

    (这是关于一个极端情况,但一般来说对标签非常有启发性,它来自另一个SO贡献者Jakub Narębski):

  

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

     
      
  • 在标记对象中作为“标记”标题的内容(您可以在“git show <tag>”的输出中看到它,也可以在“git cat-file -p <tag>”的输出中看到它,其中<tag>是重量级标记,例如v1.6.3存储库中的git.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”会将整个链显示为非标记对象......

答案 2 :(得分:6)

注意:来自commit 5e1361cbrian m. carlson (bk2204)(对于git 1.9 / 2.0 2014年第一季度)处理带有标记的日志装饰的特殊情况:

日志:使用链式标签正确处理装饰

  当标记对象引用另一个不再是引用的标记对象时,

git log未正确处理装饰,例如第二个标记被删除时。   由于未在第二个标记上调用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