告诉gitk忽略所有匹配模式的分支



假设我有一些分支的名称以inactive-开头。正如它们的名字所暗示的,这些分支是不活跃的;我留下来是为了存档。

我想告诉gitk忽略那些分支,即使我也向它传递--all标志。有办法做到这一点吗?

或者,是否有其他方便的方法来告诉gitk包括所有分支,除了名称与inactive-*匹配的分支


p.S.我确实尝试过

gitk --branches='!inactive-*'

以及它们的变体,但都不起作用。

2014:正如j6t所评论的,gitk已经提供了一个解决方案(jt6要求并记录):

gitk --exclude=inactive-* --branches

在Git 1.9(2013年第四季度)之前,人们经常希望有一种方法来告诉";CCD_ 7">(man)(和"git log --remotes --not --branches">;CCD_ 9";(类似于"--tags"、"--all"one_answers"--glob=<pattern>")
现在他们有了一个。

参见Junio C Hamano(gitster)的提交9dc01bf、提交ff32d34、提交751a2ac(2013年11月1日)和提交e7b432c(2013年8月30日)
请参阅Johannes Sixt的提交574d370(2013年9月2日)(j6t)
(由Junio C Hamano合并——gitster——于2013年12月5日提交10167eb)

rev-parse:引入--exclude=以驯服通配符

教学"CCD_ 17";相同的";我将进行glob,但省略那些与这些模式匹配的"glob";特征为";rev list";。

git rev-parse现在在其手册页中包括:

--exclude=<glob-pattern>

不包括与下一个CCD_ 20,否则--branches--tags--remotes--glob考虑重复此选项会累积排除模式直到下一个--all--branches--tags--remotes,或--glob选项(其他选项或参数不清楚累积模式)。

给定的模式不应以refs/headsrefs/tags或当将refs/remotes应用于--branches--tags--remotes时,当应用于--glob时,它们必须从refs/开始或CCD_ 38。如果要使用尾部"/{星号}",则必须给定明确地


但是,如果你必须使用git for-each-ref,请回应托雷克2017年的答案:

2023年(6年多后):是的,现在有一种方便的方法来完成

使用Git 2.42(2023年第3季度),在压缩的refs文件中枚举refs,同时排除与某些模式匹配的refs,已经得到了优化。

这意味着您可以将git for-each-ref与新的--exclude选项一起使用:

git for-each-ref --format="%(refname:short)" --exclude="inactive-" refs/heads

(该模式遵循fnmatch,但它不是真正的正则表达式)

因此:

gitk $(git for-each-ref --format="%(refname:short)" --exclude="inactive-" refs/heads)

请参阅Jeff King(peff)的提交284c55d、提交b571fb9、提交311bfe1、提交b9f7daa、提交bf1377a(2023年7月10日)
请参见Taylor Blau(ttaylorr)的提交98456ef、提交18b6b1b、提交cc2a1f9、提交15af64d、提交e6bf24d、提交c45841f、提交c489f47、提交59c35fa、提交d22d941、提交b269ac5、提交8255dd8(2023年7月10日)
(由Junio C Hamano合并——gitster——于2023年7月21日提交39fe402)

builtin/for-each-ref.c:添加--exclude选项

合著者:Jeff King

使用for-each-ref时,调用方有时可以方便地排除引用的某些部分。

例如,如果有许多refs/__hidden__/*引用,则调用者可能希望发出所有引用,隐藏的引用除外
目前,唯一的方法是对输出进行后处理,如:

$ git for-each-ref --format='%(refname)' | grep -v '^refs/hidden/'

这是可行的,但需要处理潜在的大量引用。

git for-each-ref(man)一个新的--exclude=<pattern>选项,如果引用与一个或多个排除模式匹配,则从结果中排除引用。

这个补丁提供了一个简单的实现,其中ref_filter仍然可以看到所有引用(包括它将丢弃的引用),并在发出它们之前检查每个引用是否与任何排除的模式匹配。

通过剔除我们知道调用者不关心的引用,我们可以避免为它们的存储分配内存,也可以避免花费时间对输出进行排序(以及其他事情)
即使是最简单的实现也能显著加快linux.git的修改副本(每个提交都有一个隐藏的ref):

$ hyperfine 
'git.compile for-each-ref --format="%(objectname) %(refname)" | grep -vE "[0-9a-f]{40} refs/pull/"' 
'git.compile for-each-ref --format="%(objectname) %(refname)" --exclude refs/pull/'
Benchmark 1: git.compile for-each-ref --format="%(objectname) %(refname)" | grep -vE "[0-9a-f]{40} refs/pull/"
Time (mean ± σ):     820.1 ms ±   2.0 ms    [User: 703.7 ms, System: 152.0 ms]
Range (min … max):   817.7 ms … 823.3 ms    10 runs
Benchmark 2: git.compile for-each-ref --format="%(objectname) %(refname)" --exclude refs/pull/
Time (mean ± σ):     106.6 ms ±   1.1 ms    [User: 99.4 ms, System: 7.1 ms]
Range (min … max):   104.7 ms … 109.1 ms    27 runs
Summary
'git.compile for-each-ref --format="%(objectname) %(refname)" --exclude refs/pull/' ran
7.69 ± 0.08 times faster than 'git.compile for-each-ref --format="%(objectname) %(refname)" | grep -vE "[0-9a-f]{40} refs/pull/"'

在某些情况下,后续修补程序将通过避免访问packed-refs文件的排除部分来对此进行改进。

git for-each-ref现在在其手册页中包括:

--exclude=<pattern>

如果给定一个或多个模式,则仅引用不匹配的引用显示了任何被排除的模式。匹配是使用与上述CCD_ 56的规则相同。

不,没有真正方便的方法。

这里有一种稍微不方便的方法来实现与"除了invalid-*之外的--all"类似的结果:

gitk $(git for-each-ref --format="%(refname:short)" refs/heads | grep -v '^inactive-')

也就是说,我们使用git for-each-ref来查找所有分支名称(refs/heads/*中的所有名称),然后使用grep -v来丢弃那些名称以inactive-开头的分支名称。结果列表是gitk的参数集。

(您可以很容易地修改gitk,因为gitk只是一个巨大的Tcl/Tk脚本。)

相关内容

  • 没有找到相关文章

最新更新