显示所有标签在git日志

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

编辑 :查尔斯·贝利已经拿出了答案(至less在我的情况下)
基本上,我有一个标签,指向另一个标签,指向提交。 由于这个额外的间接层,标签没有出现在日志中。 我将不得不解决这个问题,通过修改我们的标记脚本来正确标记,或通过一些shell脚本巫术recursion跟随标签枯萎。 无论如何,我会留下这个问题只是为了供参考,如果有人想要的话。 (我是堆栈溢出的新手,但我认为这是正确的协议?)

原来的问题如下…

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

所以实际上,我们在同一个提交中有多个标签。 能够在文本日志中看到这是非常好的,但似乎并不支持它。 我目前正在通过手动检查我正在查找的标签或通过启动gitkgitk 。 虽然这两个解决scheme的工作,在我看来,这真的很奇怪的git log --decorate默认支持每个提交一个标签。

我做了一些Googlesearch,但没有发现太多。 我错过了什么明显的?

PS(我实际上使用%d的自定义格式string,根据手册页和一些快速testing,这相当于 – --decorate

请注意关于标签标签(标签标签)的问题,正如Charles Bailey在评论中正确指出的那样:

确保你研究这个线程 ,因为重写一个签名标记并不那么容易:

  • 如果你已经推了一个标签, git tag手册页严重build议不要使用简单的git tag -f B来replace标签名称“ A
  • 不要尝试用git tag -f重新创build一个签名标签(参见下面的线程摘录)

    (这是关于一个angular落的情况,但总体标签颇具启发性,它来自另一个SO贡献者JakubNarębski ):

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

  • 在标签对象本身作为“标签”头的内容(你可以在“ git show <tag> ”的输出中看到它,也可以在“ git cat-file -p <tag> ”的输出中看到它,其中<tag>是重量级标签,例如git.git仓库中的git.git ),
  • 也是指向标签对象的标签引用的默认名称(在“ refs/tags/* ”名称空间中的引用)。
    请注意,标记引用 (“ refs/tags/* ”命名空间中的适当引用)纯粹是本地事务; 例如,在' refs/tags/v0.1.3 '中有一个版本库,其他的版本可以在' refs/tags/sub/v0.1.3 '中。

所以当你创build签名标签“ A ”时,你有以下情况(假设它指向某个提交)

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

还请注意,“ git tag -f AA ”(注意没有选项强制它是一个带注释的标签)是一个noop – 它不会改变这种情况。

如果你做了“ git tag -f -s AA ”:注意你强制写一个标签(所以git假定你知道你在做什么),并且用-s / -a / -m选项之一强制注释标签(标签对象的创build),您将得到以下情况

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

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

 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. 

注意:来自brian m的commit 5e1361c 。 carlson( bk2204 ) (for git 1.9 / 2.0 Q1 2014)用标签处理日志装饰的特殊情况:

日志:妥善处理链式标签的装饰

当一个标签对象引用另一个不再是ref的标签对象,比如当第二个标签被删除时, git log没有正确地处理装饰
提交不会被正确的装饰,因为parse_object还没有在第二个标签上被调用,因此它的标签字段没有被填充,导致没有标签与相关的提交相关联。

如果不存在,调用parse_object来填充这个字段,这样就可以解除引用标签链,并且可以正确地修改提交。
包括testing,以防止未来的回归。

例:

 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