remote remota rama cambiar git git-branch git-commands

remota - ¿Hay una mejor manera de averiguar si existe una sucursal local de git?



git push (12)

Estoy usando el siguiente comando para averiguar si existe una rama de git local con branch-name en 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 mantenerme alejado de los comandos de porcelana si es posible.

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

Actualizar

Resulta que hay otra manera . Gracias @jhuynh .

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


$ git branch --list $ branch_name | grep $ branch_name luego verifica que el valor de retorno sea 0 o 1.


Casi ahí.

Solo deja fuera el --verify y --quiet y obtienes el hash si la rama existe o nada si no es así.

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


Creo que puedes usar git show-branch aquí.

$ 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 cavar en la fontanería de refs / heads / en absoluto. Siempre que no pase -r a show-branch, solo operará en sucursales locales.


Cuando busco ''git check si existe una rama'' en un motor de búsqueda, esta 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 es necesario escribir en "refs / heads /"


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

git rev-parse --verify <branch> if %ERRORLEVEL% == 0 ( echo "Yes" ) else ( echo "No" )


Hasta donde yo sé, esa es la mejor manera de hacerlo en un guión. No estoy seguro de que haya mucho más que añadir a eso, pero bien podría haber una respuesta que simplemente diga "Ese comando hace todo lo que quieres" :)

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


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> puede ser simplemente un "." para especificar el repositorio local si se encuentra 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.



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

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

  • refs/heads/$name limita a las ramas locales y coincide con los nombres completos (de lo contrario, dev coincidiría con el develop )

Uso en un script:

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


Si puede lograr incluir grep.

git branch | grep -q <branch>


Vamos a llamarlo git is_localbranch (debe agregar un alias en .gitconfig ).

Uso:

$ git is_localbranch BRANCH

Fuente:

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


El resultado de la revisión en 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 también cualquier referencia con dicho nombre @jhuynh .

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

Problema con una ''Actualización'' sobre quiestion inicial explicada:

Supongamos y comprobamos que ''master.000'' es solo una etiqueta, tal rama local no existe, grep devuelve una entrada que es una etiqueta. Aún rev-parse devolverá 0 si la referencia existe, 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