是否有可能在git for-each-ref中过滤掉合并的分支?

时间:2013-12-06 05:03:51

标签: git

基本上我想要类似于git branch -a --no-merged的东西,但我也想列出标签,我之前不需要空格或类似remotes/origin/HEAD -> origin/master

之类的东西

我可以使用for-each-ref执行此操作,还是更好地从git branch剥离我不想要的内容然后单独获取标记?

2 个答案:

答案 0 :(得分:5)

实际上,从即将推出的git 2.7(2015年第4季度)git for-each-ref开始,将支持--no-merged选项,允许轻松过滤合并的分支

git for-each-ref --no-merged master refs/heads/

使用doc:

--no-merged [<object>]:
  

仅列出其指针无法从指定提交到达的引用(如果未指定,则为HEAD)。

请参阅commit 4a71109commit ee2bd06commit f266c91commit 9d306b5commit 7c32834commit 35257aacommit 5afcb90,..., commit b2172fd(2015年7月7日)和commit af83baf(2015年7月9日)Karthik Nayak (KarthikNayak)
Junio C Hamano -- gitster --合并于commit 9958dd8,2015年10月5日)

  

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  

答案 1 :(得分:2)

git for-each-ref和类似的git show-ref无法自行决定一个引用是否是另一个引用的祖先,但是你总是可以构建一个管道,例如:

uninteresting=master # or some other way to identify ones to discard
git for-each-ref |
while read sha1 reftype refname; do
    if git merge-base --is-ancestor $refname $uninteresting; then
        # $refname / $sha1 "is merged", or is exactly equal
        ... do whatever you like here ...
    else
        # there is no ancestry path from $uninteresting back to $refname
        ... do whatever else you like here ...
    fi
done

请注意git merge-base --is-ancestor master master始终为真。如果你不想“等于但名称不同”被认为是“合并”(并且这取决于它是分支还是其他一些ref类型?)你需要一些额外的代码,但我怀疑你确实想要“平等意味着合并“。