我可以使用git branch --list --contains
列出all branches containing a certain commit就好了。但正如相关question on how to list all branches中所述,这是一个不应在脚本中使用的瓷器命令。
后一个问题建议使用管道命令git for-each-ref
,但这不支持--contains
。
列出包含特定提交的所有分支的正确管道接口是什么。
答案 0 :(得分:5)
更新18个月后(2017年4月):使用Git 2.13(2017年第二季度),最终支持git for-each-ref --no-contains <SHA1>
!
请参阅commit 7505769,commit 783b829,commit ac3f5a3,commit 1e0c3b6,commit 6a33814,commit c485b24,commit eab98ee,{{3} (2017年3月24日),commit bf74804,commit 7ac04f1,commit 682b29f,commit 4612edc(2017年3月23日)和commit b643827,commit 17d6c74,{ {3}},commit 8881d35(2017年3月21日)commit b084060
(commit 0488792合并于Ævar Arnfjörð Bjarmason (avar
),2017年4月11日)
原始回答
启动git 2.7(2015年第4季度),您将获得Junio C Hamano -- gitster
--的更完整版本,现在支持--contains
git for-each-ref --contains <SHA1>
使用doc:
--contains [<object>]:
仅列出包含指定提交的标记(如果未指定,则为HEAD)。
请参阅commit d1d3d46,git for-each-ref
,commit 4a71109,commit ee2bd06,commit f266c91,commit 9d306b5,commit 7c32834,..., commit 35257aa(2015年7月7日)和commit 5afcb90(2015年7月9日)commit b2172fd。
(commit af83baf合并于Karthik Nayak (KarthikNayak
),2015年10月5日)
来自&#34;
git tag -l
&#34;的一些功能和&#34;git branch -l
&#34;已经成了 可用于&#34;git for-each-ref
&#34;这样最终统一了 在后续工作中,可以在所有三个方面共享实施 一两个系列。
* 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 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向我展示how to get rid of that nasty eval
。)