¿Hay una mejor manera de averiguar si existe una rama local de git?


192

Estoy usando el siguiente comando para averiguar si existe una rama local de git branch-nameen mi repositorio. ¿Es esto correcto? ¿Hay una mejor manera?

Tenga en cuenta que estoy haciendo esto dentro de un script. Por esta razón, me gustaría usar comandos de plomería si es posible.

git show-ref --verify --quiet refs/heads/<branch-name>
# $? == 0 means local branch with <branch-name> exists. 

Tu comando se parece al que yo había usado.
Paŭlo Ebermann

66
En mi ignorancia, me habría ido git branch | grep -w <branch-name>. Ok, es un comando de porcelana, pero no puedo imaginar que este uso particular que haber un cambio significativo en el futuro como para hacer este fragmento inservible ...
UncleZeiv

@UncleZeiv: Probablemente tengas razón en que el comando no cambiaría significativamente para dejarlo inutilizable. Tengo un poco de TOC sobre cosas como la porcelana versus la plomería, eso es todo.
Manoj Govindan

10
git rev-parse --verify <branch_name>también verifica otras referencias, como etiquetas y hashes de confirmación, por lo que, aunque podría ser más adecuado para lo que necesita, devolverá falsos positivos si solo le interesan precisamente las ramas.
Paul S.

2
Solo el git show-ref está trabajando para determinar si hay una rama LOCAL presente. En la actualización (sintaxis con git rev-parse), el código de retorno también es 0 si coincide una rama remota.
Fabien Bouleau

Respuestas:


57

Hasta donde yo sé, esa es la mejor manera de hacerlo en un script. No estoy seguro de que haya mucho más que agregar a eso, pero también podría haber una respuesta que diga "Ese comando hace todo lo que quieras" :)

Lo único de lo que debe tener cuidado es que los nombres de las ramas pueden tener caracteres sorprendentes, por lo que es posible que desee citar <branch-name>.


1
Buen punto sobre las citas <branch-name>. FWIW Estoy usando esto en un script de tela. Recordaré citar la variable.
Manoj Govindan

La respuesta correcta es esta implícitamente: git show-ref --verify --quiet refs / heads / <branch-name> mostrará que HEAD no es una rama correctamente. git rev-parse --verify le dirá que HEAD es una rama existente. Falso porque HEAD no es una rama.
Paulo Neves

106

Cuando busco 'git check if branch' en un motor de búsqueda, esta página es la primera que veo.

Obtengo lo que quiero, pero me gustaría proporcionar una respuesta actualizada ya que la publicación original era de 2011.

git rev-parse --verify <branch_name>

Esto es esencialmente lo mismo que la respuesta aceptada, pero no necesita escribir "refs / heads /"


20
Solo una nota: git rev-parse --verifysolo le indica si dicho objeto existe en el repositorio (es decir, devolverá 0 para cualquier valor <branch_name>que se traduzca en un objeto de cualquier tipo en el repositorio). No te dice si ese objeto es una rama o no.
tavnab

9
Esta no es una respuesta correcta a la pregunta, que es cómo saber si existe una rama. Esto le dará un falso positivo para una etiqueta. Puede probar esto fácilmente usted mismo. Necesita referencias / cabezas / para distinguir las etiquetas que están en referencias / etiquetas, e incluso controles remotos en referencias / controles remotos.
msouth

15
git rev-parse --verify gh-pages me da: fatal: necesitaba una sola revisión
SuperUberDuper

@SuperUberDuper probaste: git rev-parse --verify ** origin / ** gh-pages?
RoyalBigMack

32

Casi ahí.

Simplemente omita el --verifyy --quiety obtendrá el hash si la rama existe o nada si no existe.

Asignarlo a una variable y buscar una cadena vacía.

exists=`git show-ref refs/heads/<branch-name>`
if [ -n "$exists" ]; then
    echo 'branch exists!'
fi

10
El valor de retorno es suficiente: no necesita pasar por el esfuerzo posiblemente propenso a errores de asignar a una variable.
msouth

15

Creo que puedes usar git show-branchaquí.

$ git show-branch --list
  [master] test
* [testbranch] test
$ git show-branch testbranch
[testbranch] test
$ echo $?
0
$ git show-branch nonexistantbranch
fatal: bad sha1 reference nonexistantbranch
$ echo $?
128

Entonces, $? == 0 indicaría que la rama existe y no tiene que profundizar en la plomería de referencias / cabezas / en absoluto. Siempre que no pase -ra show-branch, solo operará en sucursales locales.


55
AFAIK git show-branches un comando de porcelana . Como dije en mi pregunta, prefiero no usar comandos de porcelana en un script si hay equivalentes de plomería disponibles. Ver kernel.org/pub/software/scm/git/docs
Manoj Govindan

3
@Manoj: Sé sobre porcelana versus plomería, pero nunca había leído que la plomería se considerara más estable que la porcelana. Gracias por señalarme eso en los documentos.
Mark Drago

Para evitar encontrar etiquetas por error y para ser más específico acerca de si la sucursal es local o remota, puede especificar git show-branch refs/heads/[branch]o git show-branch refs/remotes/origin/[branch].
twasbrillig

14

Recomiendo git show-ref --quiet refs/heads/$name.

  • --quiet significa que no hay salida, lo cual es bueno porque entonces puedes verificar limpiamente el estado de salida

  • refs/heads/$namelímites a las sucursales locales y coincide con los nombres completos (de lo contrario devcoincidiría develop)

Uso en un script:

if git show-ref --quiet refs/heads/develop; then
    echo develop branch exists
fi

Sí, este es el único que lo hace en silencio. El nombre de los comandos de git es un poco
loco tbh

11

Para usar en un script:

git show-ref -q --heads <branch-name>

Esto saldrá 0si y solo si <branch-name>existe como una sucursal local.

Ejemplo:

if git show-ref -q --heads <branch-name>; then
   echo 'Branch exists'
fi

2

En el script por lotes de Windows es un poco diferente,

git rev-parse --verify <branch>

if %ERRORLEVEL% == 0  (
    echo "Yes"
) else (
    echo "No"
)

1

Llamémoslo git is_localbranch(necesita agregar un alias .gitconfig).

Uso:

$ git is_localbranch BRANCH

Fuente:

git branch | grep -w $1 > /dev/null
if [ $? = 0 ]
then
  echo "branch exists"
fi

1

El resultado de la revisión de mi 'Edición sugerida' a la 'Actualización' en la pregunta inicial fue 'Debería haber sido escrito como un comentario o una respuesta', así que lo estoy publicando aquí:

La otra forma propuesta no solo verificará las ramas, sino cualquier referencia con dicho nombre @jhuynh .

git rev-parse --verify <reference-name>
# $? == 0 means reference with <reference-name> exists.

Problema con una 'Actualización' en la detención inicial explicada:

Supongamos y verifiquemos que 'master.000' es solo una etiqueta, tal rama local no existe, grep devuelve una entrada que es una etiqueta. Aún así, rev-parse devolverá 0 si existe una referencia, incluso si dicha rama local no existe. Esta es una coincidencia falsa, exactamente como lo menciona @ paul-s

$ git show-ref |grep master.000

f0686b8c16401be87e72f9466083d29295b86f4a refs/tags/master.000
$ git rev-parse --verify master.000
f0686b8c16401be87e72f9466083d29295b86f4a
$ echo $?
0



0

Ni git show-reftampoco git rev-parsefunciona en mi caso.

$ git --version
git version 2.21.0

$ git show-branch --list
* [master] mybranch commit

$ BRANCH_NAME=mybranch
$ git rev-parse --verify $BRANCH_NAME
fatal: Needed a single revision

$ git show-ref refs/heads/$BRANCH_NAME
<no otput>
$ [ $? == 0 ] && echo "$BRANCH_NAME exists" || echo "$BRANCH_NAME not exists"
mybranch not exists

Terminé con esto

$ BRANCH_NAME=mybranch
$ SHOW_ALL=`git show-branch --all | grep -w $BRANCH_NAME`
$ [ $? == 0 ] && echo "$BRANCH_NAME exists" || echo "$BRANCH_NAME not exists"
mybranch exists

Puedes hacerlo también con un archivo de script

#!/bin/sh
BRANCH_NAME=mybranch
if grep -Fqe $BRANCH_NAME << EOF
`git show-branch --all`
EOF
then
   echo "$BRANCH_NAME exists"
else
   echo "$BRANCH_NAME not exists"
fi

-1

Si puedes lograr incluir grep.

git branch | grep -q <branch>

1
Eso podría darle una respuesta incorrecta si usa puntos (".") En los nombres de las ramas, como a veces hago, ya que el punto se interpreta grepcomo un metacarácter.
Peter John Acklam

1
También obtendrá un falso positivo si prueba una rama cuyo nombre es una subcadena de una rama real. por ejemplo abc, coincidirá si hay una rama llamada abcdef.
rjmunro

-1

Para usar en un script, recomiendo el siguiente comando:

git ls-remote --heads <repo_url> "<branch_name>" | wc -l

Tenga en cuenta que <repo_url>solo puede ser un "." para especificar el repositorio local si está dentro de su estructura de directorio, la ruta a un repositorio local o la dirección de un repositorio remoto.

El comando devuelve un 0 si <branch_name>no está presente de 1 si está presente.


-1
git branch --list $branch_name | grep $branch_name

luego verifique que el valor de retorno sea 0 o 1.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.