El seguimiento de una única rama remota como una rama local es lo suficientemente sencillo.
$ git checkout --track -b ${branch_name} origin/${branch_name}
Empujar todas las sucursales locales hacia el control remoto, crear nuevas sucursales remotas según sea necesario también es fácil.
$ git push --all origin
Quiero hacer lo contrario. Si tengo X número de ramas remotas en una sola fuente:
$ git branch -r
branch1
branch2
branch3
.
.
.
¿Puedo crear ramas de seguimiento locales para todas esas ramas remotas sin necesidad de crearlas manualmente? Di algo como:
$ git checkout --track -b --all origin
He buscado en Google y RTM, pero hasta ahora he llegado a la litera.
git checkout --track origin/branchname
git pull origin
y presionetab
, para obtener una lista de ramas remotas. Luego continúa escribiendo y presionareturn
.Respuestas:
Usando bash:
después de git 1.9.1 antes de git 1.9.1Actualice las sucursales, suponiendo que no haya cambios en sus sucursales de seguimiento locales:
Ignora las advertencias ambiguas de cambio de nombre, git parece preferir la rama local como debería.
fuente
git pull
tiene un--all
interruptor, que buscará + fusionará todas las ramas rastreadas.La respuesta dada por Otto es buena, pero todas las ramas creadas tendrán "origen /" como inicio del nombre. Si solo desea que la última parte (después de la última /) sean sus nombres de rama resultantes, use esto:
También tiene el beneficio de no darle ninguna advertencia sobre referencias ambiguas.
fuente
grep -v master
, ¿qué talgrep -v /HEAD
? Esto parece filtrar la rama predeterminada, sin necesidad de personalizaciónLa mayoría de las respuestas aquí complican demasiado el análisis de la salida de
git branch -r
. Puede usar el siguientefor
bucle para crear las ramas de seguimiento en todas las ramas del control remoto de esta manera.Ejemplo
Digamos que tengo estas ramas remotas.
Confirme que no estamos rastreando nada más que maestro, localmente:
Puede usar este único revestimiento para crear las ramas de seguimiento:
Ahora confirme:
Para eliminarlos:
Si utiliza el
-vv
interruptor agit branch
puede confirmar:Desglose de for loop
El ciclo básicamente llama al comando
git branch -r
, filtrando cualquier rama HEAD o maestra en la salida usandogrep -vE "HEAD|master"
. Para obtener los nombres de solo las ramas menos laorigin/
subcadena, usamos la manipulación de cadenas de Bash${var#stringtoremove}
. Esto eliminará la cadena, "stringtoremove" de la variable$var
. En nuestro caso, estamos eliminando la cadenaorigin/
de la variable$i
.NOTA: Alternativamente, puede usar
git checkout --track ...
para hacer esto también:Pero no me importa particularmente este método, ya que lo está cambiando entre las ramas ya que realiza un pago. Cuando termine, te dejará en la última rama que creó.
Referencias
fuente
Actualización de Q1 2020: Mohsen Abasi propone en los comentarios , basado en el 2014 slm 's respuesta , la alternativa más simple:
Y utiliza en
$()
lugar de retrocesos obsoletos .Como mencioné en otra vieja respuesta , el uso
git for-each-ref
es probablemente más rápido .Y usaría el nuevo
git switch
comando (Git 2.23+) , que reemplaza el confusogit checkout
.De esa manera, no es
grep
necesario.Antigua respuesta original (2011):
Aquí está mi one-liner que uso (en un shell bash, probado con msysgit1.7.4):
Para copiar y pegar:
Para más legibilidad:
remote
variable (puede ser 'origin
' o cualquier nombre que haya establecido para uno de los controles remotos de su repositorio Git actual).origin/a/Branch/Name => a/Branch/Name
través de laawk
expresión.establecerá la rama ascendente a través de
--set-upstream-to
(o-u
) , no--track
:La ventaja es que, si la rama ya existe, no fallará y no cambiará el origen de esa rama, solo configurará la
branch.xxx.(remote|merge)
configuración.Ese comando creará ramas locales para todas las ramas remotas ascendentes y establecerá su configuración remota y de fusión en esa rama remota.
fuente
--set-upstream-to
lugar de--track
sin embargo.git switch
lugar degit checkout
. Pero tu (muy buena) idea permanece.Podrías escribir ese script con bastante facilidad, pero no sé cuándo sería valioso. Esas ramas se retrasarían rápidamente y tendrías que actualizarlas todo el tiempo.
Las sucursales remotas se mantendrán actualizadas automáticamente, por lo que es más fácil crear la sucursal local en el punto donde realmente desea trabajar en ella.
fuente
git up
actualiza todas las sucursales locales.fuente
| grep -v HEAD
a la tubería para que funcione correctamente.sin ninguna secuencia de comandos (en un directorio vacío):
después de eso, todas las ramas remotas se verán como locales.
original (en ruso) .
fuente
Si desea usar powershell y su control remoto se llama origen. Entonces esto funciona.
fuente
git svn clone'd
repositorio:git branch -r | %{$_ -replace " origin/"} | %{git checkout -b $_ "origin/$_"}
git branch -r | %{$_ -replace " origin/"} | %{git branch -u "origin/$_" $_}
Use esto y no tendrá advertencias como: refname 'origin / dev' es ambiguo
fuente
Aquí está mi solución del comando BASH que hace referencia a @tjmcewan:
Mi objetivo es resolver el problema de que todas las ramas creadas tendrán "origen /" como inicio del nombre, porque probé que las variables $ remotas todavía incluyen "origen /":
fuente
Para hacer lo mismo que la respuesta de tjmcewan pero en Windows, llame a esto desde un archivo por lotes :
O esto desde la línea de comando :
fuente
Desde git 2.23 en adelante:
La
-C
bandera degit switch
crea o restablece si ya existe.documentación del interruptor git
fuente
En caso de que ya tenga algunas sucursales desprotegidas y desee
puede usar el siguiente script compatible con bash y zsh:
fuente
Explicación:
línea 1: 'git branch -r' (seguido de 'git remote update' para actualizar la información sobre los cambios a remote) enumera todas las ramas remotas; 'egrep -vw' se usa para eliminar entradas que tienen HEAD y master en el resultado.
línea 3: Rastree la rama remota nombrada mientras la extrae localmente. Se utiliza un awk simple para evitar que 'origin /' sea el sufijo de las sucursales locales.
fuente
Usando bash, si quieres pagar todas las ramas:
Es importante tener en cuenta que cuando realiza una búsqueda que derriba nuevas ramas de seguimiento remoto, no tiene automáticamente copias locales editables de ellas.
fuente