假设我有一些名称以inactive-开头的分支。正如它们的名字所暗示的,这些分支是不活跃的;我是为了存档而留下的。我想告诉gitk忽略这些分支,即使我也传递了--all标志。有办法做到这一点吗?或者,是否有其他方便的方法告诉gitk包含所有分支 * 除了 * 那些名称与inactive-*匹配的分支?P.S.我试过了
inactive-
gitk
--all
inactive-*
gitk --branches='!inactive-*'
字符串......及其变体,但都不起作用。
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 9dc01bf、commit ff32d34、commit 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日)
git log --branches
git log --remotes --not --branches
--branches
--tags
--glob=<pattern>
gitster
j6t
rev-parse
教“rev-parse”相同的“我要glob,但省略那些匹配这些模式的”功能作为“rev-list”。git rev-parse现在在其手册页中包括:
git rev-parse
--exclude=<glob-pattern>
不包括与下一个--all、--branches、--tags、--remotes或--glob匹配的参考。重复使用此选项会将排除模式累积到下一个--all、--branches、--tags、--remotes或--glob选项(其他选项或参数不会清除累积的模式)。当分别应用于--branches、--tags或--remotes时,给出的模式不应以refs/heads、refs/tags或refs/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选项一起使用:
--remotes
--glob
refs/heads
refs/tags
refs/remotes
refs/
git for-each-ref
--exclude
git for-each-ref --format="%(refname:short)" --exclude="inactive-" refs/heads
型(The模式遵循fnmatch,但它不是真正的正则表达式)于是:
fnmatch
gitk $(git for-each-ref --format="%(refname:short)" --exclude="inactive-" refs/heads)
型参见commit 284c55d,commit b571fb9,commit 311bfe1,commit b9f7daa,commit bf1377a(2023年7月10日)by Jeff King ( peff )。参见commit 98456ef、commit 18b6b1b、commit cc2a1f9、commit 15af64d、commit e6bf24d、commit c45841f、commit c489f47、commit 59c35fa、commit d22d941、commit b269ac5、commit 8255dd8(2023年7月10日)和Taylor Blau ( ttaylorr )。(由Junio C Hamano -- gitster --合并于commit 39fe402,2023年7月21日)
peff
ttaylorr
builtin/for-each-ref.c
共同撰写人:杰夫·金签字人:杰夫·金签字人:泰勒·布劳在使用for-each-ref时,有时调用者可以方便地排除引用的某些部分。例如,如果有许多refs/__hidden__/*引用,调用者可能希望发出所有引用 * 除了 * 隐藏的引用。目前,唯一的方法是对输出进行后处理,例如:
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):
--exclude=<pattern>
ref_filter
$ 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现在在其手册页中包括:
packed-refs
如果给出了一个或多个模式,则仅示出与任何排除的模式不匹配的参考。匹配使用与上面<pattern>相同的规则完成。
<pattern>
zu0ti5jz2#
不,没有真正方便的方法来做到这一点。这里有一个稍微不方便的方法来实现类似于“--all except for invalid-*”的结果:
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脚本。
refs/heads/*
grep -v
2条答案
按热度按时间dgenwo3n1#
2014年:正如j6t的评论,
gitk
已经提供了一个解决方案(由jt 6请求并记录):字符串
在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 9dc01bf、commit ff32d34、commit 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/heads
、refs/tags
或refs/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
选项一起使用:型
(The模式遵循
fnmatch
,但它不是真正的正则表达式)于是:
型
参见commit 284c55d,commit b571fb9,commit 311bfe1,commit b9f7daa,commit bf1377a(2023年7月10日)by Jeff King (
peff
)。参见commit 98456ef、commit 18b6b1b、commit cc2a1f9、commit 15af64d、commit e6bf24d、commit c45841f、commit c489f47、commit 59c35fa、commit d22d941、commit b269ac5、commit 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
(man)一个新的--exclude=<pattern>
选项,如果引用与一个或多个排除的模式匹配,该选项将从结果中排除。此补丁提供了一个简单的实现,
ref_filter
仍然可以看到所有引用(包括它将丢弃的引用),并在发射之前检查每个引用是否匹配任何排除的模式。通过剔除我们知道调用者不关心的引用,我们可以避免为它们的存储分配内存,以及花费时间排序输出(以及其他事情)。
即使是简单的实现也能在修改过的linux.git副本上提供显著的加速(在每次提交时都有一个隐藏的ref):
型
后续的修补程序将通过避免在某些情况下访问
packed-refs
文件的排除部分来对此进行改进。git for-each-ref
现在在其手册页中包括:--exclude=<pattern>
如果给出了一个或多个模式,则仅示出与任何排除的模式不匹配的参考。匹配使用与上面
<pattern>
相同的规则完成。zu0ti5jz2#
不,没有真正方便的方法来做到这一点。
这里有一个稍微不方便的方法来实现类似于“
--all
except forinvalid-*
”的结果:字符串
也就是说,我们使用
git for-each-ref
查找所有分支名称(refs/heads/*
中的所有内容),然后使用grep -v
丢弃名称以inactive-
开头的分支名称。结果列表是gitk
的参数集。(You可以修改
gitk
来相当容易地做到这一点,因为gitk
只是一个巨大的Tcl/Tk脚本。