对于我们的buildbot,我想显示最近更新的活动(未发布)分支。假设我有一个master
分支,以及以下内容,从最老的到最新的提交:
-
branch1
(未并入master
) -
branch2
(合并) -
branch3
(未合并)
我可以分别得到这些列表中的每一个…例如,获取所有未合并到master
的分支:
$ git branch -r --no-merged origin/master
origin/branch1
origin/branch3
或者获得前15个分支,按最近提交排序(通过https://coderwall.com/p/ndinba):
$ git for-each-ref --sort=-committerdate --format='%(committerdate:short) %(refname:short)' --count=15 refs/remotes/origin/
2013-03-22 origin/branch3
2013-03-22 origin/branch2
2013-03-22 origin/master
2013-03-22 origin/branch1
所以我基本上想要第二个列表,减去branch2
(有或没有master
)。希望你能理解?
您可以将两者组合起来,像这样:
git for-each-ref --sort=-committerdate --format="%(committerdate:short) %(refname:short)" --count=15 $(git branch -r --no-merged origin/master | sed -e 's#^ *#refs/remotes/#')
这将限制for-each-ref
只处理branch --no-merged
报告的分支…
编辑:修正了实际测试后git branch
输出的格式…
你就不能把branch2换掉吗?
基本上是这样的:
for branch in `git branch -r --no-merged origin/master`; do git for-each-ref --sort=-committerdate --format='%(committerdate:short) %(refname:short)' --count=15 refs/remotes/origin/ | grep $branch; done;
根据您的示例输出,这对我有效。
在git 2.7(2015年第四季度)中,git for-each-ref
将支持--no-merged
选项
git for-each-ref --no-merged master refs/heads/
With the doc:
--no-merged [<object>]:
只列出从指定的提交(如果未指定则为HEAD)中无法访问的引用。
参见commit 4a71109, commit ee2bd06, commit f266c91, commit 9d306b5, commit 7c32834, commit 35257aa, commit 5afcb90,…,提交b2172fd(2015年7月7日),并提交af83baf(2015年7月9日)由Karthik Nayak (KarthikNayak
)。
(由juno C Hamano - gitster
-在commit 9958dd8,2015年10月05日合并)
来自"
git tag -l
";和";git branch -l
";已经完成了提供给"git for-each-ref
";所以最终统一了在后续工作中,实现可以在所有三者之间共享系列或两个
* kn/for-each-tag-branch:
for-each-ref: add '--contains' option
ref-filter: implement '--contains' option
parse-options.h: add macros for '--contains' option
parse-option: rename parse_opt_with_commit()
for-each-ref: add '--merged' and '--no-merged' options
ref-filter: implement '--merged' and '--no-merged' options
ref-filter: add parse_opt_merge_filter()
for-each-ref: add '--points-at' option
ref-filter: implement '--points-at' option
使用Git 2.29(2020年第四季度),"git for-each-ref
"(man)和朋友列表refs过去只允许一个--merged
或--no-merged
过滤它们;他们学会了把这两种过滤结合起来。
参见Aaron Lipman (alipman88
)的commit b59cdff, commit a1b19aa (18 Sep 2020)和commit 21bf933, commit 415af72, commit b775d81 (15 Sep 2020)。
(由juno C Hamano - gitster
-在commit 26a3728,2020年9月22日合并)
ref-filter
:允许merged
和no-merged
过滤器署名:Aaron Lipman
允许ref-filter处理多个
merged
和no-merged
过滤器,并将功能扩展到git branch
(man),git tag git
(man)和for-each-ref
。
这提供了一种简单的方法来检查"毕业候选人"的分支:$ git branch --no-merged master --merged next
如果通过多个合并(或多个
no-merged
)过滤器,refs必须从任何一个合并提交中可访问,并且从no-merged
提交中不可访问。
filters
现在包含在它的手册页:
组合多个
--merged
和--no-merged
过滤器时,仅至少可以从--merged
中的一个访问的引用所有的--no-merged
提交都没有显示。
注意:相同的Git 2.29 (Q4 2020)增加了一个热修复。
参见renrscharfe
)的commit 5336d50 (26 Sep 2020)。
gitster
合并)
ref-filter
:堵塞reach_filter()
内存泄漏
21 bf933928(";
ref-filter
:允许合并和未合并的过滤器", 2020-09-15, Git v2.29.0——合并在批次#16中列出)添加了早期返回到reach_filter()
。
通过推迟数组的分配,直到我们知道我们需要它,可以避免未使用数组的内存泄漏。