我可以列出包含某个提交的所有分支,使用git branch --list --contains
就好了。但正如有关如何列出所有分支的相关问题中所解释的,这是一个不应在脚本中使用的瓷命令。
后一个问题建议使用管道命令git for-each-ref
,但不支持--contains
。
列出包含某个提交的所有分支的正确管道接口是什么。
我可以列出包含某个提交的所有分支,使用git branch --list --contains
就好了。但正如有关如何列出所有分支的相关问题中所解释的,这是一个不应在脚本中使用的瓷命令。
后一个问题建议使用管道命令git for-each-ref
,但不支持--contains
。
列出包含某个提交的所有分支的正确管道接口是什么。
18 个月后(2017 年 4 月)更新git for-each-ref --no-contains <SHA1>
:终于支持Git 2.13(2017 年第二季度) !
参见提交7505769,提交783B829,提交AC3F5A3,提交1E0C3B6,提交6A33814,提交C485B24,提交EAB98EE,提交BF74804(2017年3月24日),提交7AC04F1,提交7AC04F,提交682b29f,commits 463 fors 463和MAR 4643274327432744432744444327444444444444444444444444444。,提交 8881d35,提交 b084060,提交 0488792(2017 年 3 月 21 日),作者: Ævar Arnfjörð Bjarmason ( avar
)。
(由Junio C Hamano 合并——gitster
--在提交 d1d3d46中,2017 年 4 月 11 日)
原始答案
开始 git 2.7 (Q4 2015) 你会得到一个更完整的版本git for-each-ref
,现在支持--contains
git for-each-ref --contains <SHA1>
使用文档:
--contains [<object>]:
仅列出包含指定提交的标签(如果未指定,则为 HEAD)。
请参阅提交 4a71109,提交 ee2bd06,提交 f266c91,提交 9d306b5,提交 7c32834,提交 35257aa,提交 5afcb90,...,提交 b2172fd(2015 年 7 月 7 日)和提交 af83baf(2015 年 7 月 9 日),作者为Karthik Nayak(KarthikNayak
)。
(由Junio C Hamano 合并gitster
——在提交 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
使用管道命令的一种可能解决方案git-for-each-ref
和git merge-base
(后者由 Joachim 本人建议):
#!/bin/sh
# git-branchesthatcontain.sh
#
# List the local branches that contain a specific revision
#
# Usage: git branchthatcontain <rev>
#
# To make a Git alias called 'branchesthatcontain' out of this script,
# put the latter on your search path, and run
#
# git config --global alias.branchesthatcontain \
# '!sh git-branchesthatcontain.sh'
if [ $# -ne 1 ]; then
printf "%s\n\n" "usage: git branchesthatcontain <rev>"
exit 1
fi
rev=$1
git for-each-ref --format='%(refname:short)' refs/heads | \
while read ref; do
if git merge-base --is-ancestor "$rev" "$ref"; then
printf "%s\n" "$ref"
fi;
done
exit $?
该脚本可在GitHub 上的Jubobs/git-aliases获得。
(编辑:感谢coredump向我展示了如何摆脱那个讨厌的eval
.)