基本上我想要类似于git branch -a --no-merged
的东西,但我也想列出标签,我之前不需要空格或类似remotes/origin/HEAD -> origin/master
我可以使用for-each-ref执行此操作,还是更好地从git branch
剥离我不想要的内容然后单独获取标记?
答案 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 4a71109,commit ee2bd06,commit f266c91,commit 9d306b5,commit 7c32834,commit 35257aa,commit 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类型?)你需要一些额外的代码,但我怀疑你确实想要“平等意味着合并“。