我如何获得未合并到master的分支列表,按最近提交排序



对于我们的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:允许mergedno-merged过滤器

署名:Aaron Lipman

允许ref-filter处理多个mergedno-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)增加了一个热修复。

参见ren Scharfe (rscharfe)的commit 5336d50 (26 Sep 2020)。

(由juno C Hamano - gitster合并)

ref-filter:堵塞reach_filter()内存泄漏

21 bf933928(";ref-filter:允许合并和未合并的过滤器", 2020-09-15, Git v2.29.0——合并在批次#16中列出)添加了早期返回到reach_filter()
通过推迟数组的分配,直到我们知道我们需要它,可以避免未使用数组的内存泄漏。

最新更新