显示所有标签在git日志
为什么git log --decorate
每个提交不会显示多个标记?
编辑 :查尔斯·贝利已经拿出了答案(至less在我的情况下)
基本上,我有一个标签,指向另一个标签,指向提交。 由于这个额外的间接层,标签没有出现在日志中。 我将不得不解决这个问题,通过修改我们的标记脚本来正确标记,或通过一些shell脚本巫术recursion跟随标签枯萎。 无论如何,我会留下这个问题只是为了供参考,如果有人想要的话。 (我是堆栈溢出的新手,但我认为这是正确的协议?)
原来的问题如下…
背景:我们在工作中使用GIT进行源代码控制,而且我们有一个策略,在部署时总是标记提交。 (它实际上是一个脚本,它执行标签,然后将标签拉到服务器上)。 由于它是一个具有独立登台和生产服务器的Web应用程序,因此我们通常会标记用于登台的版本(用于testing或其他),然后稍后将相同的提交标记为生成。
所以实际上,我们在同一个提交中有多个标签。 能够在文本日志中看到这是非常好的,但似乎并不支持它。 我目前正在通过手动检查我正在查找的标签或通过启动gitk
来gitk
。 虽然这两个解决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