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

qxgroojn  于 2023-08-01  发布在  Git
关注(0)|答案(2)|浏览(122)

假设我有一些名称以inactive-开头的分支。正如它们的名字所暗示的,这些分支是不活跃的;我是为了存档而留下的。
我想告诉gitk忽略这些分支,即使我也传递了--all标志。有办法做到这一点吗?
或者,是否有其他方便的方法告诉gitk包含所有分支 * 除了 * 那些名称与inactive-*匹配的分支?
P.S.我试过了

gitk --branches='!inactive-*'

字符串
......及其变体,但都不起作用。

dgenwo3n

dgenwo3n1#

2014年:正如j6t的评论,gitk已经提供了一个解决方案(由jt 6请求并记录):

gitk --exclude=inactive-\* --branches

字符串
在Git 1.9(Q4 2013)之前,人们经常希望有一种方法来告诉“git log --branches”(man)(和“git log --remotes --not --branches”(man)),以从“--branches”的扩展中排除一些本地分支(类似于“--tags”,“--all”和“--glob=<pattern>”)。
现在他们有了一个。
参见Junio C Hamano ( gitster )commit 9dc01bfcommit ff32d34commit 751a2ac(2013年11月1日)和commit e7b432c(2013年8月30日)。
参见Johannes Sixt ( j6t )commit 574d370(2013年9月2日)。
(由Junio C Hamano -- gitster --合并于commit 10167eb,2013年12月5日)

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

教“rev-parse”相同的“我要glob,但省略那些匹配这些模式的”功能作为“rev-list”。
git rev-parse现在在其手册页中包括:

--exclude=<glob-pattern>

不包括与下一个--all--branches--tags--remotes--glob匹配的参考。重复使用此选项会将排除模式累积到下一个--all--branches--tags--remotes--glob选项(其他选项或参数不会清除累积的模式)。
当分别应用于--branches--tags--remotes时,给出的模式不应以refs/headsrefs/tagsrefs/remotes开始,当应用于--glob--all时,它们必须以refs/开头。如果要使用尾随的“/{星号}”,则必须显式给出。
但是,如果你必须使用git for-each-ref,那么要回显torek的2017 answer
2023年(6年后):是的,现在有一种方便的方法可以做到这一点
在Git 2.42(Q3 2023)中,枚举packed-refs文件中的refs,同时排除匹配某些模式的refs,已得到优化。
这意味着您可以将git for-each-ref与新的--exclude选项一起使用:

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


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

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


参见commit 284c55dcommit b571fb9commit 311bfe1commit b9f7daacommit bf1377a(2023年7月10日)by Jeff King ( peff )
参见commit 98456efcommit 18b6b1bcommit cc2a1f9commit 15af64dcommit e6bf24dcommit c45841fcommit c489f47commit 59c35facommit d22d941commit b269ac5commit 8255dd8(2023年7月10日)和Taylor Blau ( ttaylorr )
(由Junio C Hamano -- gitster --合并于commit 39fe402,2023年7月21日)

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

共同撰写人:杰夫·金
签字人:杰夫·金
签字人:泰勒·布劳
在使用for-each-ref时,有时调用者可以方便地排除引用的某些部分。
例如,如果有许多refs/__hidden__/*引用,调用者可能希望发出所有引用 * 除了 * 隐藏的引用。
目前,唯一的方法是对输出进行后处理,例如:

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


这是可行的,但需要处理潜在的大量引用。
示教git for-each-refman)一个新的--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>

如果给出了一个或多个模式,则仅示出与任何排除的模式不匹配的参考。匹配使用与上面<pattern>相同的规则完成。

zu0ti5jz

zu0ti5jz2#

不,没有真正方便的方法来做到这一点。
这里有一个稍微不方便的方法来实现类似于“--all except for invalid-*”的结果:

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

字符串
也就是说,我们使用git for-each-ref查找所有分支名称(refs/heads/*中的所有内容),然后使用grep -v丢弃名称以inactive-开头的分支名称。结果列表是gitk的参数集。
(You可以修改gitk来相当容易地做到这一点,因为gitk只是一个巨大的Tcl/Tk脚本。

相关问题