Cloné un repositorio de Git, que contiene aproximadamente cinco ramas. Sin embargo, cuando lo hago git branch
, solo veo uno de ellos:
$ git branch
* master
Sé que puedo hacer git branch -a
para ver todas las ramas, pero ¿cómo podría tirar todas las ramas localmente para que cuando lo haga git branch
, muestre lo siguiente?
$ git branch
* master
* staging
* etc...
git
branch
git-branch
David542
fuente
fuente
--single-branch
configuración al clonar: stackoverflow.com/questions/17714159/… (¡git fetch --all
nunca funcionará si ha especificado solo una rama!)git clone --bare <repo url> .git
(observe que necesita agregar "--bare" y ".git" al final para clonar el repositorio como "desnudo" repositorio), luegogit config --bool core.bare false
(establece el indicador "desnudo" en falso), luegogit reset --hard
(mueve la CABEZA a la CABEZA actual en el repositorio). Ahora, sigit branch
debería ver todas las ramas del repositorio que clonó.Respuestas:
Puede buscar todas las ramas de todos los controles remotos como este:
Básicamente es un movimiento de poder .
fetch
actualiza copias locales de sucursales remotas para que esto siempre sea seguro para sus sucursales locales PERO :fetch
no actualizará sucursales locales (que rastrean sucursales remotas); si desea actualizar sus sucursales locales, aún necesita extraer todas las sucursales.fetch
no creará sucursales locales (que rastrean sucursales remotas), debe hacerlo manualmente. Si desea enumerar todas las ramas remotas:git branch -a
Para actualizar sucursales locales que rastrean sucursales remotas:
Sin embargo, esto puede ser aún insuficiente. Funcionará solo para sus sucursales locales que rastrean sucursales remotas. Para rastrear todas las ramas remotas, ejecute este oneliner ANTES
git pull --all
:TL; versión DR
(Parece que pull obtiene todas las ramas de todos los controles remotos, pero siempre busco primero solo para estar seguro).
Ejecute el primer comando solo si hay sucursales remotas en el servidor que sus sucursales locales no rastrean.
PS AFAIK
git fetch --all
ygit remote update
son equivalentes.Comentario de Kamil Szot , que la gente ha encontrado útil.
fuente
git checkout -b localname remotename/remotebranch
for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done
porque su código creado ramas locales nombrados origen / BRANCHNAME y que estaba recibiendo "refname 'origen / BRANCHNAME' es ambiguo cuando me refería a ella.git pull --all; for remote in `git branch -r | grep -v \>`; do git branch --track ${remote#origin/} $remote; done
. El cambio elimina HEAD.for /F %remote in ('git branch -r') do ( git branch --track %remote) && git fetch --all && git pull --all
Para enumerar sucursales remotas:
git branch -r
Puede consultarlos como sucursales locales con:
git checkout -b LocalName origin/remotebranchname
fuente
git checkout remotebranchname
y funciona. ¿Cuál es la diferencia con su solución?git checkout remotebranchname
usa para crear una nueva rama no relacionada que se denomina nombre de rama remota .Deberá crear sucursales locales que rastreen sucursales remotas.
Suponiendo que solo tiene un control remoto llamado
origin
, este fragmento creará sucursales locales para todos los rastreadores remotos:Después de eso,
git fetch --all
actualizará todas las copias locales de sucursales remotas.Además,
git pull --all
actualizará sus ramas de seguimiento locales, pero dependiendo de sus confirmaciones locales y de cómo se configura la opción de configuración 'fusionar', podría crear una confirmación de fusión, adelantar o fallar.fuente
git pull --all
actualizará todas las sucursales de rastreo locales? Por lo que puedo decir, solo actualiza la rama actual de todos los controles remotos.origin
? Vea esta respuesta que funcionará en todos los nombres remotos.Si lo haces:
entonces estarán todos allí localmente. Si luego realiza:
los verá listados como remotos / origin / branch-name. Como están allí localmente, puedes hacer lo que quieras con ellos. Por ejemplo:
o
o
fuente
--all
)git fetch -all
busca todas las ramas de todos los controles remotos.git fetch origin
recupera todas las ramas del control remotoorigin
. Lo último es lo que preguntaba el OP.--all
significa "todos los controles remotos", no "todas las ramas de un control remoto dado". Esto último está implícito en cualquier búsqueda desde un control remoto.Esto supone que se rastrean todas las ramas.
Si no lo están, puedes disparar esto en Bash:
Luego ejecuta el comando.
fuente
->
que probablemente exista en la salida degit branch -r
como `origin / HEAD -> origin / master`Branch 'origin/quote-filenames' set up to track local branch 'master'.
La salida deseada es:Branch 'quote-filenames' set up to track remote branch 'quote-filenames' from 'origin'.
Esto es al revés , configurando el origen para rastrear el control remoto. Vea esta respuesta para una solución.git fetch
no funcionó. Entonces, la lección aquí es que necesitas rastrear las ramas remotas. Gracias!El
for
bucle Bash no estaba funcionando para mí, pero esto hizo exactamente lo que quería. Todas las ramas de mi origen reflejaban el mismo nombre localmente.Vea el comentario de Mike DuPont a continuación. Creo que estaba tratando de hacer esto en un servidor Jenkins que lo deja en modo de cabeza separada.
fuente
fatal: Refusing to fetch into current branch refs/heads/master of non-bare repository
después de un simple clon. Hay que separar la cabeza primero. Hice esto congit checkout <SHA>
git checkout --detach # detach the head
y luegogit fetch origin \'+refs/heads/*:refs/heads/*
Uso
git fetch && git checkout RemoteBranchName
.Funciona muy bien para mi ...
fuente
origin/branch
; es suficiente decir solobranch
).Cuando clonas un repositorio, toda la información de las ramas se descarga, pero las ramas están ocultas. Con el comando
puedes mostrar todas las ramas del repositorio y con el comando
luego puede "descargarlos" manualmente uno a la vez.
Sin embargo, hay una forma mucho más limpia y rápida, aunque es un poco complicado. Necesita tres pasos para lograr esto:
Primer paso
cree una nueva carpeta vacía en su máquina y clone una copia espejo de la carpeta .git desde el repositorio:
el repositorio local dentro de la carpeta my_repo_folder todavía está vacío, solo hay una carpeta oculta .git ahora que puede ver con un comando "ls -alt" desde el terminal.
Segundo paso
cambie este repositorio de un repositorio vacío (desnudo) a un repositorio regular cambiando el valor booleano "desnudo" de las configuraciones de git a falso:
Tercer paso
Tome todo lo que está dentro de la carpeta actual y cree todas las ramas en la máquina local, por lo tanto, este es un repositorio normal.
Así que ahora puede simplemente escribir el comando
git branch
y puede ver que se descargan todas las ramas.Esta es la forma rápida en que puede clonar un repositorio git con todas las ramas a la vez, pero no es algo que quiera hacer para cada proyecto de esta manera.
fuente
Puedes buscar todas las ramas de la siguiente manera:
o:
El
--depth=10000
parámetro puede ayudar si ha reducido el repositorio.Para tirar de todas las ramas, use:
Si lo anterior no funciona, preceda el comando anterior con:
ya
remote.origin.fetch
que solo puede admitir una rama específica durante la recuperación, especialmente cuando clonaste tu repositorio--single-branch
. Compruebe esto:git config remote.origin.fetch
.Después de eso, deberías poder pagar cualquier sucursal.
Ver también:
Para empujar todas las ramas al control remoto, use:
eventualmente
--mirror
para reflejar todas las referencias.Si su objetivo es duplicar un repositorio, consulte: Duplicación de un artículo de repositorio en GitHub.
fuente
depth=1
) y la configuración también especificó una rama específica parafetch
- eldepth=1000
parámetro fue la solución que me ayudó a verificar una rama remota específicapull --all
no tira todas las ramas, sino todos los controles remotosUsualmente no uso nada más que comandos como este:
Una versión un poco más corta:
fuente
Creo que ha clonado el repositorio de la siguiente manera:
Ahora ve a esa carpeta usando cd:
Si escribe
git status
puede ver todo:Para ver todos los tipos de ramas ocultas:
Enumerará todas las sucursales remotas.
Ahora, si desea pagar en una sucursal en particular, simplemente escriba:
fuente
Si está buscando una solución para obtener todas las sucursales y luego migrar todo a otro servidor Git, organizo el siguiente proceso. Si solo desea actualizar todas las ramas localmente, deténgase en la primera línea vacía.
fuente
git fetch git pull
stackoverflow.com/a/292359/1114926pull
, Git es elfetch
primero, pero es más fácil saber si el problema es de lafetch
partepull
o de lamerge
parte posterior depull
cuándofetch
se ejecuta de forma independiente.Después de clonar el repositorio principal, solo puede ejecutar
fuente
Asegúrese de que todas las ramas remotas sean recuperables en el
.git/config
archivo.En este ejemplo, solo la
origin/production
rama es recuperable, incluso si intenta hacergit fetch --all
nada, solo irá a buscar laproduction
rama:Esta línea debe ser reemplazada por:
Luego corre,
git fetch
etc.fuente
git config --get remote.origin.fetch
y luego a (destructiva) configurarlo:git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
Looping no parecía funcionar para mí y quería ignorar origin / master. Esto es lo que funcionó para mí.
Después de esto:
fuente
grep | awk
antipatrón :git branch -r | awk -F 'origin/' '!/HEAD|master/{
...Solo estos tres comandos obtendrán todas las ramas:
fuente
pull --all
. Pero si aún se necesita, entonces la otra respuesta a continuación, de @Johnno Nola, suponiendo que se rastreen todas las ramas, mezcladas con esta respuesta, es el camino a seguir.¿Por qué nadie responde a la pregunta de los chicos y explica qué está sucediendo?
Rastrea todas las ramas remotas:
Rastree todas las ramas que existen en el repositorio remoto.
Hazlo manualmente:
Reemplazaría
<branch>
con una rama que se muestra desde la salida degit branch -r
.Hazlo con un script bash
Actualice la información sobre las sucursales remotas en su computadora local:
Esto obtiene actualizaciones en las ramas del repositorio remoto que está rastreando en su repositorio local. Esto no altera sus sucursales locales. Su repositorio local de git ahora está al tanto de las cosas que han sucedido en las sucursales remotas del repositorio. Un ejemplo sería que se ha enviado una nueva confirmación al maestro remoto, al realizar una búsqueda ahora se le avisará que su maestro local está retrasado por 1 confirmación.
Actualice la información sobre las sucursales remotas en su computadora local y actualice las sucursales locales:
Hace una búsqueda seguida de una fusión para todas las ramas desde la rama remota a la local. Un ejemplo sería que se ha enviado una nueva confirmación al maestro remoto; si realiza una extracción, se actualizará su repositorio local sobre los cambios en la rama remota y luego se fusionarán en su rama local. Esto puede crear un gran desastre debido a la fusión de conflictos.
fuente
Escribí un pequeño script para gestionar la clonación de un nuevo repositorio y crear sucursales locales para todas las sucursales remotas.
Puedes encontrar la última versión aquí :
Para usarlo, simplemente cópielo en su directorio git bin (para mí, eso es
C:\Program Files (x86)\Git\bin\git-cloneall
), luego, en la línea de comando:Se clona como de costumbre, pero crea ramas de seguimiento locales para todas las ramas remotas.
fuente
Cómo recuperar todas las ramas de Git Rastreo remoto único.
Esto ha sido probado y funciona en Red Hat y Git Bash en Windows 10.
TLDR:
Explicación:
El único revestimiento revisa y luego busca todas las ramas excepto HEAD.
Enumere las ramas de seguimiento remoto.
Ignorar CABEZA.
Quite el nombre de la sucursal de los controles remotos.
Verifique todas las sucursales que rastrean un solo control remoto.
Fetch para la rama desprotegida.
Técnicamente, la búsqueda no es necesaria para nuevas sucursales locales.
Esto puede usarse para cualquiera
fetch
opull
ramas que son nuevos y tienen cambios en distancia (s).Solo asegúrate de tirar solo si estás listo para fusionar.
Configuración de prueba
Echa un vistazo a un repositorio con SSH URL.
antes de
Consultar sucursales en local.
Ejecutar comandos
Ejecute el un trazador de líneas.
Después
Verifique que las sucursales locales incluyan sucursales remotas.
fuente
Para usuarios de Windows que usan PowerShell:
fuente
git branch -r | ForEach-Object { # Skip default branch, this script assumes # you already checked-out that branch when cloned the repo if (-not ($_ -match " -> ")) { $localBranch = ($_ -replace "^.*?/", "") $remoteBranch = $_.Trim() git branch --track "$localBranch" "$remoteBranch" } }
Aquí hay algo que consideraría robusto:
HEAD
para rastrearorigin/HEAD
origin
No es necesario que
git fetch --all
pase-all
agit pull
pasa esta opción a la internafetch
.Crédito a esta respuesta .
fuente
Aquí hay una versión de Perl del one-liner proporcionada en la respuesta aceptada:
git branch -r | perl -e 'while(<>) {chop; my $remote = $_; my ($local) = ($remote =~ /origin\/(.*)/); print "git branch --track $local $remote\n";}' > some-output-file
Puede ejecutar el archivo de salida como un script de Shell si lo desea.
Eliminamos nuestro repositorio de proyectos Stash por accidente. Afortunadamente, alguien había creado un tenedor justo antes de la pérdida accidental. Cloné el tenedor en mi local (omitirá los detalles de cómo lo hice). Una vez que tuve el tenedor completamente en mi local, corrí una línea. Modifiqué la URL del control remoto (origen en mi caso) para apuntar al repositorio de destino al que nos estábamos recuperando:
git remote set-url origin <remote-url>
Y finalmente empujó todas las ramas al origen así:
git push --all origin
y estábamos de vuelta en el negocio.
fuente
Podemos poner todos los nombres de ramas o etiquetas en un archivo temporal, luego hacemos git pull para cada nombre / etiqueta:
fuente
Si tiene problemas con el
fetch --all
seguimiento de su rama remota:fuente
Para evitar el mensaje de error 'fatal: ya existe una rama llamada' origen / maestro '.', Necesita esto:
fuente
Basado en la respuesta de Learath2, esto es lo que hice después de hacer
git clone [...]
ecd
ingresar al directorio creado:git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b
Funcionó para mí pero no puedo saber que funcionará para usted. Ten cuidado.
fuente
Ahora localmente tu
yourNewLocalBranchName
es turequiredRemoteBranch
.fuente
Para usuarios de Visual Studio, en la consola de Package Manager:
rama de git | % {git buscar aguas arriba; git merge upstream / master}
fuente
Lo he intentado de muchas maneras, solo esta es simple y funciona para mí.
fuente
Establecer alias: (basado en la respuesta principal)
Ahora para rastrear todas las ramas:
git track-all-branches
fuente