2010-06-14 17 views
13

Tengo un repositorio local clonado desde un repositorio remoto simple. El siguiente comando enumera todas las ramas del repositorio remoto.En git, ¿cómo reviso las sucursales remotas de un repositorio remoto?

$ git ls-remote <remote> 

74bd3eb190edb39db04f6c0c4dbbb9e1e96bc6db refs/remotes/test 
85de54d6ae813c624b9623983e6b0a4948dae0fe refs/remotes/trunk 

que desea para la obtención y realizar un seguimiento a distancia rama tronco de ese remoto. ¿Cómo puedo hacer eso?

Tenga en cuenta que esto es diferente de verificar la sucursal local de un repositorio remoto. Así es como se ve el repositorio remoto.

$ git branch -a 

master 
remotes/test 
remotes/trunk 

Después de ejecutar git fetch < remota> a buscar todas las ramas del repositorio remoto, consigo esta salida en el repositorio local.

$ git branch -r 

repo/HEAD -> repo/master 
repo/master 
+1

Las respuestas de Jefromi y Chris deberían ser suficientes. Acabo de agregar como referencia la interesante pregunta SO http://stackoverflow.com/questions/1070496/having-a-hard-time-understanding-git-fetch. – VonC

Respuesta

11

Puede obtener cualquier referencia de cualquier control remoto (siempre que el servidor esté dispuesto a dársela). La clave para obtener refs fuera del refs/heads/ es proporcionar rutas de referencia completas que comiencen con refs/. Si lo desea, puede incluso extraer de repositorios que no están configurados como controles remotos (git fetch puede tomar una URL en lugar de un nombre remoto).

De forma predeterminada, las configuraciones remotas configuradas solo se recuperarán del espacio de nombres refs/heads/ del repositorio remoto, por lo que no recogerán nada dentro de refs/remotes/. Pero, podría referirse a una referencia dentro de ella utilizando una referencia completa como refs/remotes/trunk (remotes/trunk también podría funcionar, pero también podría ser ambiguo).

Si el refspec obtenido no especifica una referencia de destino, se almacenará en la referencia FETCH_HEAD especial.


Fetch de refs/remote/trunk en FETCH_HEAD y comprobar que funciona como una cabeza separada de un repositorio:

git fetch remote-name-or-url refs/remotes/trunk && 
git checkout FETCH_HEAD 

mismo, pero crear una, rama local llamado en lugar de utilizar una cabeza separada:

git fetch remote-name-or-url refs/remotes/trunk && 
git checkout -b trunk-from-remote FETCH_HEAD 

Lo mismo, pero directamente en una sucursal local:

git fetch remote-name-or-url refs/remotes/trunk:trunk-from-remote && 
git checkout trunk-from-remote 

Si está trabajando con un control remoto configurado, puede volver a escribir su configuración remote.<remote-name>.fetch y agregar una entrada adicional para automatizar la búsqueda de refs/heads/ y .

# fetch branchs of remote into remote-name/heads/* 
git config remote.remote-name.fetch '+refs/heads/*:refs/remotes/remote-name/heads/*' && 
# fetch remotes of remote into remote-name/remotes/* 
git config --add remote.remote-name.fetch '+refs/remotes/*:refs/remotes/remote-name/remotes/*' 

para evitar posibles colisiones, el ejemplo anterior configura FETCH para almacenar refs en espacios de nombres disjuntos (…/heads/ y …/remotes/). Puede elegir diferentes nombres si lo desea. Si está seguro de que no habrá conflictos, incluso puede rellenarlos directamente bajo refs/remotes/remote-name/.

+0

¿Puedo configurar esto para que automáticamente separe la rama remota del control remoto en una rama local de seguimiento? ¿O será mejor que me asegure de que el control remoto tenga sucursales de seguimiento locales, que luego sigo localmente? –

+0

@Hans: He reescrito la respuesta. Desactivé el aspecto de "remoto remoto no configurado" que probablemente no era tan importante para ti y añadí un poco al final sobre la automatización de la recuperación. –

+0

¿Cómo configuro una sucursal local para rastrear una de esas sucursales remotas remotas? Hago un correcto 'git checkout -b trunk --track repo/remotes/trunk', pero luego un 'git pull repo' no comprenderá mi configuración de branch.trunk.merge. Tengo que hacer un 'git pull repo refs/remotes/trunk: refs/remotes/repo/remotes/trunk' para que funcione. –

-1

git.exe checkout --track -b trunk refs/remotes/trunk

+0

El problema aquí es que la rama remota no tiene ramas locales que rastreen sus ramas remotas. –

+0

Se supone que deletrea "el repositorio remoto no tiene" ... –

6

Buena pregunta! Sé que esto funciona; no puede pensar en otra cosa que no hace la parte superior de mi cabeza:

git fetch origin refs/remotes/trunk 
git checkout FETCH_HEAD 
# or make a branch to check out 
git checkout -b remote-trunk FETCH_HEAD 

Es extraño, por cierto, que esas referencias remotas que no son de la forma refs/remotes/<remote-name>/<branch-name> ... tal vez no he entendido bien los nombres, pero el método funciona

3

En realidad, he encontrado una solución satisfactoria para esto. Agregar un control remoto configura un refspec para recuperar y extraer sus encabezados locales. Configuré otro control remoto al que llamo/repo-remotes/que busca las referencias remotas del control remoto. El archivo .git/config termina luciendo así

[remote "repo"] 
    url = ssh://[email protected]<hostname>:<port>/repo 
    fetch = +refs/heads/*:refs/remotes/repo/* 

[remote "repo-remotes"] 
    url = ssh://[email protected]<hostname>:<port>/repo 
    fetch = +refs/remotes/*:refs/remotes/repo-remotes/* 

Puedo hacer esto.

$ git fetch repo-remotes 
$ git checkout -b remote-trunk --track remotes/repo-remotes/trunk 

Que configura una rama local que rastrea la bifurcación/tronco remota del repositorio remoto.

+0

No es necesario un segundo control remoto, solo agregue una configuración extra de búsqueda. –

Cuestiones relacionadas