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