Rastree todas las sucursales remotas de git como sucursales locales

El seguimiento de una sola sucursal remota como una sucursal local es bastante sencillo.

$ git checkout --track -b ${branch_name} origin/${branch_name} 

Al empujar todas las sucursales locales hasta el control remoto, la creación de nuevas sucursales remotas según sea necesario también es fácil.

 $ git push --all origin 

Quiero hacer lo contrario. Si tengo X cantidad de twigs remotas en una sola fuente:

 $ git branch -r branch1 branch2 branch3 . . . 

¿Puedo crear twigs de seguimiento locales para todas las sucursales remotas sin necesidad de crearlas manualmente? Diga algo como:

 $ git checkout --track -b --all origin 

He buscado en Google y RTM, pero he subido hasta ahora.

Usando bash:

 for remote in `git branch -r `; do git branch --track $remote; done 

Actualice las sucursales, suponiendo que no haya cambios en sus sucursales locales de seguimiento:

 for remote in `git branch -r `; do git checkout $remote ; git pull; done 

Ignore las ambiguas advertencias de refombre, git parece preferir la twig local como debería.

La respuesta dada por Otto es buena, pero todas las twigs creadas tendrán "origen /" como el comienzo del nombre. Si solo desea que la última parte (después del último /) sea el nombre de su twig resultante, utilice esto:

 for remote in `git branch -r | grep -v /HEAD`; do git checkout --track $remote ; done 

También tiene el beneficio de no advertirte acerca de references ambiguas.

Aquí está mi one-liner que uso (en un shell bash, probado con msysgit1.7.4):

Para copyr y pegar:

 remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do git branch --set-upstream-to $remote/$brname $brname; done 

Para más lectura:

 remote=origin ; // put here the name of the remote you want for brname in ` git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}' `; do git branch --set-upstream-to $remote/$brname $brname; done 
  • solo seleccionará twigs ascendentes desde el control remoto que especifique en la variable remote (puede ser ' origin ' o cualquier nombre que haya establecido para uno de los controles remotos de su repository actual de Git).
  • extraerá el nombre de la twig: origin/a/Branch/Name => a/Branch/Name través de la expresión awk .
  • establecerá la twig ascendente a través de --set-upstream-to (o -u ) , no --track :
    La ventaja es que, si la twig ya existe, no fallará y no cambiará el origen de la sucursal, solo configurará la configuration branch.xxx.(remote|merge) .

     branch.aBranchName.remote=origin branch.aBranchName.merge=refs/heads/a/Branch/Name 

Ese command creará twigs locales para todas las sucursales ascendentes remotas y establecerá su configuration remota y de fusión en esa twig remota.

La mayoría de las respuestas están complicando el análisis de la salida de git branch -r . Puede usar el siguiente ciclo for para crear las twigs de rastreo contra todas las twigs en el control remoto como ese.

Ejemplo

Digamos que tengo estas twigs remotas.

 $ git branch -r origin/HEAD -> origin/master origin/development origin/integration origin/master origin/production origin/staging 

Confirma que no estamos rastreando nada más que el dominio ya, localmente:

 $ git branch -l # or using just git branch * master 

Puede usar este delineador para crear las twigs de seguimiento:

 $ for i in $(git branch -r | grep -vE "HEAD|master"); do git branch --track ${i#*/} $i; done Branch development set up to track remote branch development from origin. Branch integration set up to track remote branch integration from origin. Branch production set up to track remote branch production from origin. Branch staging set up to track remote branch staging from origin. 

Ahora confirma:

 $ git branch development integration * master production staging 

Para eliminarlos:

 $ git br -D production development integration staging Deleted branch production (was xxxxx). Deleted branch development (was xxxxx). Deleted branch integration (was xxxxx). Deleted branch staging (was xxxxx). 

Si usa el -vv a la git branch , puede confirmar:

 $ git br -vv development xxxxx [origin/development] commit log msg .... integration xxxxx [origin/integration] commit log msg .... * master xxxxx [origin/master] commit log msg .... production xxxxx [origin/production] commit log msg .... staging xxxxx [origin/staging] commit log msg .... 

Desglose de for loop

El ciclo básicamente llama al command git branch -r , filtrando cualquier HEAD o twigs principales en la salida usando grep -vE "HEAD|master" . Para get los nombres de solo las twigs less el origin/ subcadena, utilizamos la manipulación de cadena de Bash ${var#stringtoremove} . Esto eliminará la cadena, "stringtoremove" de la variable $var . En nuestro caso, estamos eliminando el origin/ la cadena origin/ de la variable $i .

NOTA: Alternativamente puede usar git checkout --track ... para hacer esto también:

 $ for i in $(git branch -r | grep -vE "HEAD|master" | sed 's/^[ ]\+//'); do git checkout --track $i; done 

Pero particularmente no me importa este método, ya que lo está cambiando entre las sucursales mientras realiza un pago. Cuando termine, lo dejará en la última twig que creó.

Referencias

  • 10.1. Manipulación de cadenas – Guía avanzada de scripts Bash
  • 3.5 Git Branching – Ramas remotas

Podrías escribir eso fácilmente, pero no sé cuándo sería valioso. Esas twigs rápidamente se quedarían atrás, y tendrías que actualizarlas todo el time.

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.

 for i in `git branch -a | grep remote`; do git branch --track ${i#remotes/origin/} $i; done 
 for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master`; do git branch --track ${branch##*/} $branch; done 

Úselo y no tendrá la siguiente advertencia: el nombre de la reference 'origen / dev' es ambiguo

Para hacer lo mismo que la respuesta de tjmcewan pero en Windows, llámalo desde un file por lotes :

 for /f "delims=" %%r in ('git branch -r ^| grep -v master') do git checkout --track %%r 

O esto desde la línea de command :

 for /f "delims=" %r in ('git branch -r ^| grep -v master') do git checkout --track %r 

sin ningún tipo de script (en un directory vacío):

 $ git clone --bare repo_url .git $ git config core.bare false $ git checkout 

después de eso, todas las sucursales remotas se verán como locales.


original (en ruso) .

Aquí está mi solución del command de BASH referido por @tjmcewan:

 for remote in `git branch -r | grep -v /HEAD `; do git branch --track ${remote/"origin/"/""}; done 

Mi objective es resolver el problema de que todas las twigs creadas tendrán "origen /" como el comienzo del nombre, porque probé que $ las variables remotas aún incluyen "origen /":

 for remote in `git branch -r | grep -v /HEAD`; do echo $remote ; done 

Si quieres usar powershell y tu control remoto se llama origen. Entonces esto funciona.

 git fetch git branch -r | %{$_ -replace " origin/"} | %{git branch --track $_ "origin/$_"} 

En caso de que ya tenga algunas sucursales desprotegidas y desee

  • echa un vistazo a todas las twigs restantes desde el control remoto
  • asegúrese de que todas las sucursales locales rastreen las sucursales remotas

puede usar el siguiente script compatible con bash y zsh:

 git branch -r | while read b; do if git branch | grep -q " ${b##*/}$"; then git branch --set-upstream ${b##*/} $b; else git branch --track ${b##*/} $b; fi; done 
 for rembranch in `git remote update 2>&1 > /dev/null ; git branch -r|egrep -wv "HEAD|master"` do git checkout --track -b `echo $rembranch|awk -F\/ '{print $2}'` $rembranch; done 

Explicación:

línea 1: 'git branch -r' (seguido de 'git remote update' para actualizar la información sobre los cambios a control remoto) list todas las sucursales remotas; 'egrep -vw' se usa para rechazar inputs que tienen HEAD y master en el resultado.

línea 3: Rastree la twig remota nombrada mientras la revisa localmente. Se usa un simple awk para evitar que 'origin /' sea el sufijo para las twigs locales.