我们的存储库中的每个提交都有一个与之关联的标记。分支上有很多标签,名称中包含“B7”。我可以运行gitk
并排除所有这些“B7”代码吗?相反,如何运行gitk
并仅显示执行中包含“B7”的提交?
我已经厌倦了gitk --all
并且得到了一堆额外的毛病。
答案 0 :(得分:3)
在我写这篇文章的过程中,我想到你可能希望显示提交,但只是希望其中一些提交不显示指向它们的标记。这回答了一个问题:“我如何看到所有提交可以从某些或所有分支到达,但不能从某些不能从这些分支到达的某些标记到达提交?”。
gitk
采用与git-rev-list
相同的选项,用于选择要显示的提交。因此,您可以提供--all
和/或--branches
,而不是--tags
,而这两者都接受“模式”参数。
不幸的是,模式参数是shell glob样式模式,其中很容易包含那些包含B7
(*B7*
将执行此操作)的模式,但很难排除那些包含{B7
的模式。 1}}嵌入在其中的任意位置。如果B7
位于名称的开头或 end ,那就不那么困难,但仍然有点混乱:例如,--tags="[AC-Za-z]*" --tags="B[A-Za-z0-689]*"
是可能足以匹配不以B7
开头的两个或多个字符标记(添加--tags="?"
以包含单字符标记)。
(这里的双引号是为了防止shell尝试扩展shell样式的glob,尽管在大多数shell变体中,只要[当前目录]中没有名称以{{1}开头的文件你可以在没有它们的情况下逃脱。)
为了获得完全的灵活性,您可以使用--tags=
或git for-each-ref
枚举引用,通过git show-ref
之类的方式管道引用名称以包含或排除任意正则表达式,并将结果作为结果传递给grep -v
的参数。例如,要查看所有分支上的所有提交,以及
gitk
(没有经过实际测试,但很简单,应该可以正常工作,假设有gitk --branches $(git for-each-ref --format='%(refname:short)' refs/tags/ |
grep -v B7)
或sh
个shell。)
(对于bash
或csh
,将所有内容放在一行,或者在换行前使用反斜杠;并将tcsh
替换为cmd ... $(subcmd ...)
。反引用版本通常在语法上较差因为它不能嵌套,但在这种情况下它会做。即使我使用tcsh作为交互式shell,我切换到sh进行脚本编写。)