git scripting: cómo enumerar todas las twigs de git que contienen un commit

Puedo enumerar todas las twigs que contienen una determinada confirmación usando git branch --list --contains fine. Pero como se explica en la pregunta relacionada sobre cómo enumerar todas las twigs , este es un command de porcelana que no se debe usar en las secuencias de commands.

La última pregunta sugiere usar el command de plomería git for-each-ref , pero eso no es compatible con --contains .

¿Cuál es la interfaz de plomería correcta para enumerar todas las twigs que contienen una determinada confirmación?

Una posible solución usando los commands de plomería git-for-each-ref y git merge-base (esta última sugerida por el propio 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 $? 

El script está disponible en Jubobs / git-aliases en GitHub.

(Editar: gracias a Conetworkingump por mostrarme cómo deshacerse de esa desagradable eval .)

Actualización 18 meses después (abril de 2017) : con Git 2.13 (Q2 2017), finalmente se admite git for-each-ref --no-contains <SHA1> .

Ver commit 7505769 , commit 783b829 , commit ac3f5a3 , commit 1e0c3b6 , commit 6a33814 , commit c485b24 , commit eab98ee , commit bf74804 (24 Mar 2017), commit 7ac04f1 , commit 682b29f , commit 4612edc , commit b643827 (23 Mar 2017) y commit 17d6c74 , commit 8881d35 , commit b084060 , commit 0488792 (21 Mar 2017) por Ævar Arnfjörð Bjarmason ( avar ) .
(Fusionado por Junio ​​C Hamano – gitster – in commit d1d3d46 , 11 de abril de 2017)


Respuesta original

Al iniciar git 2.7 (Q4 2015) obtendrá una versión más completa de git for-each-ref , que ahora es compatible con --contains

 git for-each-ref --contains <SHA1> 

Con el doc:

 --contains [<object>]: 

Solo las tags de list que contienen la confirmación especificada (HEAD si no se especifica).


Consulte commit 4a71109 , commit ee2bd06 , commit f266c91 , commit 9d306b5 , commit 7c32834 , commit 35257aa , commit 5afcb90 , …, commit b2172fd (07 Jul 2015), y commit af83baf (09 Jul 2015) por Karthik Nayak ( KarthikNayak ) .
(Fusionado por Junio ​​C Hamano – gitster – in commit 9958dd8 , 05 de octubre de 2015)

Algunas características de " git tag -l " y " git branch -l " se han puesto a disposition de " git for-each-ref " para que, finalmente, la implementación unificada se pueda compartir entre las tres, en una serie de seguimiento o dos .

 * 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