假设我有一些分支的名称以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/heads
、refs/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脚本。)