6

我可以列出包含某个提交的所有分支,使用git branch --list --contains就好了。但正如有关如何列出所有分支的相关问题中所解释的,这是一个不应在脚本中使用的瓷命令。

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

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

4

2 回答 2

5

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提交682b29fcommits 463 fors 463MAR 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  
于 2015-10-07T09:12:49.363 回答
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向我展示了如何摆脱那个讨厌的eval.)

于 2015-08-06T11:49:23.407 回答