¿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. 
Manoj Govindan
fuente
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>.

Mark Longair
fuente
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 /"

jhuynh
fuente
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
Martijn
fuente
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.

Mark Drago
fuente
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
Razzi Abuissa
fuente
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
Tom Hale
fuente
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"
)
vansia rosada
fuente
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

fuente
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
Pshemy108
fuente
1
git show-branch <BRANCH-NAME> &>/dev/null && echo yes || echo no
Vojtech Vitek
fuente
1

Sí, hay uno.

git rev-parse [<options>] <args>…​

Consulte https://git-scm.com/docs/git-rev-parse donde puede encontrar el conjunto de argumentos y la función.

git rev-parse --verify <branch-name>
Benjamin W.
fuente
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
Chetabahana
fuente
-1

Si puedes lograr incluir grep.

git branch | grep -q <branch>
Daniel Vikström
fuente
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.

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

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

Howell ZHU
fuente