Necesito hacer una fusión de subárbol para una rama específica, si existe en un repositorio remoto dado. El problema es que el repositorio remoto no está desprotegido localmente, por lo que no puedo usarlo git branch -r
. Todo lo que tengo es una dirección remota, algo como esto https://github.com/project-name/project-name.git
. ¿Hay alguna forma de enumerar las sucursales remotas solo por una dirección remota? No pude encontrar nada útil :(
105
git ls-remote --heads ${REPO} ${BRANCH} | grep ${BRANCH} >/dev/null
seguido porif [ "$?" == "1" ] ; then echo "Branch doesn't exist"; exit; fi
/refs/heads/branch-name
. De lo contrario, la ramafoo/branch-name
se devolverá incluso cuando no hayabranch-name
.git ls-remote --heads origin branch-name
fuente
git ls-remote --exit-code . origin/branch-name &> /dev/null
luego lo usé$?
como operando de pruebaif git ls-remote ...; then ...; fi
, es menos propenso a errores que la verificación$?
(que se puede cambiar mediante declaraciones de registro, trampas, etc.).--heads
?--heads
solo enumera las ramas. utilizar--tags
para enumerar etiquetas solamente.Otra forma que puede usar en la carpeta actual si es un repositorio git para ejecutar
fuente
git branch -a | egrep "remotes/origin/${YOUR_BRANCH_NAME}$"
git branch -a | grep "\b${BRANCH}$"
git fetch
es necesario si se usagit branch -a
para que todas las referencias remotas se obtengan primero. De lo contrario, usegit ls-remote
como lo señalaron otros.git branch -a --list '<pattern>'
también es una opción. Pipe to grep si necesita un código de retorno para su script.También puedes usar esto:
devuelve el último compromiso y valor de $? es 0; de lo contrario, devuelve "fatal: bad sha1 reference remotes / origin / <>" y valor de $? es 128
fuente
Entonces no es necesario pasar manualmente el nombre del repositorio cada vez.
En vez de
Ejemplo:
O
Ambos darán la misma salida:
Más sobre Origin : Git tiene el concepto de "controles remotos", que son simplemente URL a otras copias de su repositorio. Cuando clonas otro repositorio, Git crea automáticamente un remoto llamado "origen" y lo apunta. Puede ver más información sobre el control remoto escribiendo git remote show origin.
fuente
Todas las respuestas aquí son específicas del shell de Linux, lo que no ayuda mucho si se encuentra en un entorno que no admite ese tipo de operaciones, por ejemplo, el símbolo del sistema de Windows.
Afortunadamente
git ls-remote
acepta un--exit-code
argumento que devuelve 0 o 2 dependiendo de si la rama existe o no, respectivamente. Entonces:git ls-remote --exit-code --heads origin <branch-that-exists-in-origin>
devolverá 0, y
git ls-remote --exit-code --heads origin <branch-that-only-exists-locally>
volverá 2.
Para PowerShell, simplemente puede usar la semántica de control de veracidad incorporada:
if (git ls-remote --heads origin <branch-that-exists-in-origin>) { $true } else { $false }
rinde
$true
, mientras que:if (git ls-remote --heads origin <branch-that-only-exists-locally>) { $true } else { $false }
rendimientos
$false
.fuente
Puede hacer algo como esto en la terminal Bash. Simplemente reemplace los ecos con los comandos que desea ejecutar.
Espero eso ayude.
fuente
Trabaja la mayor parte del tiempo.
Pero no funcionará si la rama coincide parcialmente como se muestra a continuación,
Utilizar
si quieres una forma confiable.
Si desea usar en un script y no quiere asumir
origin
como remoto predeterminado, entoncesDeberia trabajar.
Tenga en cuenta que
git branch -a | grep ...
no es confiable, ya que puede haber pasado un tiempo desde quefetch
se ejecutó la última vez.fuente
grep -x "$branch"
es idéntica agrep ^"$branch"$
). Aunque en los scripts que prefiero el formato largo conmuta:--line-regexp
. Además, no hay necesidad de hacerlowc -l
. Poner una salida vacía en un Bash seif [ -z ]
evalúa efectivamente como verdadero, por lo que significa que la rama no existe. Eso le ahorra unos milisegundos.Puede agregar el repositorio que tiene como un uso remoto
git remote add something https://github.com/project-name/project-name.git
y luego hacer unagit remote show something
para obtener toda la información sobre el control remoto. Esto requiere una conexión de red y es útil para uso humano.Alternativamente, haz un
git fetch something
. Esto buscará todas las ramas en el control remoto llamadosomething
y las mantendrá en su repositorio local. Luego, puede combinarlos en su sucursal local como desee. Recomiendo este camino ya que si finalmente se decide que tiene a la fusión, esto es lo que hay que hacer.OT: Su uso de "verificado localmente" indica que está abordando esto desde un punto de vista de sistema de control de versiones centralizado. Eso suele ser un callejón sin salida cuando se trata de git. Utiliza palabras como "pago", etc. de manera diferente a como lo hacían los sistemas más antiguos.
fuente
Puedes probar
Aquí se
@{u}
refiere a remoto / ascendente, y se@{0}
refiere a HEAD local actual (con la versión más nueva de git,@{0}
se puede abreviar como@
). Si el control remoto no existe, se produce un error.Con git 2.16.2 (no estoy seguro de qué versión es la primera en tener esta funcionalidad, por ejemplo, git 1.7.1 no la tiene), puede hacerlo
Si existe una rama remota, habrá alguna salida, como
De lo contrario, no hay salida.
fuente
Devolverá todas las ramas (remotas o locales) que contengan la consulta en el nombre.
git branch --all | grep <query>
fuente
Si los nombres de sus sucursales son muy específicos, es posible que no necesite usar grep para una simple coincidencia de nombres de sucursales:
que funciona para
Usamos un ID de problema único como nombres de sucursales y funciona bien.
fuente
Acabo de intentar esto:
Esto devolverá 1 si se encuentra la rama "su-rama" y 0 en caso contrario.
fuente
Estoy combinando algunas de las respuestas anteriores en un script:
Este script obtendrá 4 ramas de un bitbucket remoto y las enviará a un github remoto, y luego enviará todas las etiquetas a github. Estoy usando esto en un trabajo de Jenkins, por eso no ve ninguno
git fetch
ogit pull
, eso ya está hecho en la configuración del repositorio de trabajos de Jenkins.Por lo general, prefiero las opciones de formato largo en los scripts. Podría haber combinado
git branch
ygit checkout
usandogit checkout -B
.fuente