git脚本:如何列出包含提交的所有git分支

时间:2015-08-06 10:43:39

标签: git bash git-plumbing

我可以使用git branch --list --contains列出all branches containing a certain commit就好了。但正如相关question on how to list all branches中所述,这是一个不应在脚本中使用的瓷器命令。

后一个问题建议使用管道命令git for-each-ref,但这不支持--contains

列出包含特定提交的所有分支的正确管道接口是什么。

2 个答案:

答案 0 :(得分:5)

更新18个月后(2017年4月):使用Git 2.13(2017年第二季度),最终支持git for-each-ref --no-contains <SHA1>

请参阅commit 7505769commit 783b829commit ac3f5a3commit 1e0c3b6commit 6a33814commit c485b24commit eab98ee,{{3} (2017年3月24日),commit bf74804commit 7ac04f1commit 682b29fcommit 4612edc(2017年3月23日)和commit b643827commit 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 d1d3d46git for-each-refcommit 4a71109commit ee2bd06commit f266c91commit 9d306b5commit 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-refgit 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。)