No debe usar git branch al escribir scripts. Git proporciona una interfaz de "plomería" que está diseñada explícitamente para su uso en secuencias de comandos (muchas implementaciones actuales e históricas de los comandos de Git normales (agregar, verificar, fusionar, etc.) utilizan esta misma interfaz).
El comando de plomería que desea es git for-each-ref :
git for-each-ref --shell \
--format='git log --oneline %(refname) ^origin/master' \
refs/heads/
Nota: No necesita el remotes/
prefijo en la referencia remota a menos que tenga otras referencias que hagan origin/master
coincidir varios lugares en la ruta de búsqueda del nombre de referencia (consulte "Un nombre de referencia simbólico. ..." en la sección Especificación de revisiones de git-rev-parse (1) ). Si usted está tratando de evitar la ambigüedad explicitamente, y luego ir con el nombre completo ref: refs/remotes/origin/master
.
Obtendrá un resultado como este:
git log --oneline 'refs/heads/master' ^origin/master
git log --oneline 'refs/heads/other' ^origin/master
git log --oneline 'refs/heads/pu' ^origin/master
Puede canalizar esta salida a sh .
Si no le gusta la idea de generar el código de shell, puede renunciar a un poco de robustez * y hacer esto:
for branch in $(git for-each-ref --format='%(refname)' refs/heads/); do
git log --oneline "$branch" ^origin/master
done
* Los nombres de referencia deben estar a salvo de la división de palabras del shell (consulte git-check-ref-format (1) ). Personalmente, me quedaría con la versión anterior (código de shell generado); Estoy más seguro de que nada inapropiado puede pasar con él.
Dado que especificó bash y admite matrices, puede mantener la seguridad y aún evitar generar las entrañas de su bucle:
branches=()
eval "$(git for-each-ref --shell --format='branches+=(%(refname))' refs/heads/)"
for branch in "${branches[@]}"; do
# …
done
Podría hacer algo similar con $@
si no está usando un shell que admita matrices ( set --
para inicializar y set -- "$@" %(refname)
agregar elementos).