为什么git log --decorate
每次提交不会显示多个代码?
编辑:Charles Bailey提出了答案(至少在我的情况下) 本质上,我有一个标记指向另一个指向提交的标记。由于这个额外的间接层,标记未显示在日志中。我将不得不解决这个问题,通过修复我们的标记脚本来正确标记,或者通过一些shell脚本voodoo以递归方式跟踪标记。无论如何,我会留下这个问题仅供参考,万一有人想要它。 (我是堆栈溢出的新手,但我认为这是正确的协议?)
Backstory:我们在工作中使用GIT进行源代码控制,我们的策略是在部署时始终标记提交。 (它实际上是一个执行标记的脚本,然后在服务器上提取标记)。由于它是一个带有单独的登台和生产服务器的Web应用程序,我们经常标记一个版本用于登台(用于测试或其他),然后标记相同的提交以进行生产。
所以我们经常在同一次提交中有多个标签。能够在文本日志中看到这一点会非常好,但它似乎不支持它。我目前正在解决这个问题,方法是手动检查我正在寻找的标签,或者点燃gitk
。虽然这两种解决方案都有效,但在我看来,git log --decorate
默认情况下每次提交仅支持一个标记真的很奇怪。
我做了一些谷歌搜索,但没有找到太多。我错过了一些明显的东西吗?
P.S。 (我实际上使用自定义格式字符串%d
,根据手册页和一些快速测试,它相当于--decorate
)
答案 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 5e1361c的brian 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