我们存储库中的每个提交都有一个与其关联的标记。分支上有很多名称中有"B7"的标记。我可以运行gitk
并排除所有这些"B7"标记吗?相反,如何运行gitk
并仅显示中有"B7"的提交?
我厌倦了做gitk --all
和得到一堆额外的绒毛。
在写这篇文章的中途,我突然想到,也许你希望显示提交,但只是希望其中一些提交不显示指向它们的标记。相反,这回答了这样一个问题:"我如何看待从某些或所有分支可访问的所有提交,而不是从某些标记可访问的提交,而这些标记也不能从这些分支访问?"。
gitk
采用与git-rev-list
相同的选项,用于选择要显示的提交。因此,您可以提供--branches
和/或--tags
,而不是--all
,它们都接受"模式"参数。
不幸的是,模式参数是shell glob风格的模式,其中包含B7
的模式非常容易(*B7*
会起作用),但很难排除那些包含嵌入在任意位置的B7
的模式。如果B7
位于名称的开始或结束,尽管仍然有点混乱:例如,--tags="[AC-Za-z]*" --tags="B[A-Za-z0-689]*"
可能足够好,可以匹配两个或多个不以B7
开头的字符标签(添加--tags="?"
以包括一个字符标签)。
(这里的双引号是为了防止shell试图扩展shell样式的globs,尽管在大多数shell变体中,只要[当前目录中]没有名称以--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
或bash
外壳,它很简单,应该可以工作)。
(对于csh
或tcsh
,将所有内容放在一行上,或者在换行之前使用反斜杠;并将cmd ... $(subcmd ...)
替换为cmd ... `subcmd ...`
。后引号版本通常在语法上较差,因为它不能嵌套,但在这种情况下它会嵌套。即使我使用tcsh作为交互式shell,我也会切换到sh进行脚本编写。)