2012-04-09 23 views
21

¿Cómo es posible obtener todos los nombres de algunas ramas de origen remoto?Git lista de nombres de ramas de control remoto específico

Comencé desde --remote --list opciones, pero obtuve el mensaje y las ramas redundantes origin/HEAD -> origin/master del otro origen.

$> git branch --remote --list 
    origin/HEAD -> origin/master 
    origin1/develop 
    origin1/feature/1 
    origin1/feature/2 
    origin1/feature/3 
    origin1/master 
    origin2/develop 
    origin2/feature/1 
    origin2/feature/2 
    origin2/master 

Ramas de origen específica podrían coincidir con <pattern> opción, pero el mensaje redundante sigue ahí. En realidad, ese patrón no es realmente correcto, porque el nombre de algún origen podría ser una subcadena de otro nombre de origen, o incluso alguna rama.

$> git branch --remote --list origin1* 
    origin1/HEAD -> origin/master 
    origin1/develop 
    origin1/feature/1 
    origin1/feature/2 
    origin1/feature/3 
    origin1/master 

Lo que estoy buscando es una lista de nombres de rama de origin1, cualquiera de ellos que podría utilizar para git checkout comando. Algo así:

develop 
feature/1 
feature/2 
feature/3 
master 

Es importante que se debe hacer sin grep, sed, tail o incluso ghc -e envoltorios, sólo que con cierto git poder, debido a su variación y unsafeness.

Respuesta

30

Es importante que se debe hacer sin grep, sed, tail o incluso ghc -e envoltorios, sólo que con verdadero poder git, debido a su variación y unsafeness.

Eso sólo es cierto para los comandos git porcelana (ver "What does the term porcelain mean in Git?")

Utilice el comando ls-remote, y entonces usted será capaz de filtrar su salida de fontanería.

ls-remoto sin parámetro todavía enumerar el cabezal remoto:

[email protected]:~/ce/ce6/.git$ git ls-remote origin 
8598d26b4a4bbe416f46087815734d49ba428523 HEAD 
8598d26b4a4bbe416f46087815734d49ba428523 refs/heads/master 
38325f657380ddef07fa32063c44d7d6c601c012 refs/heads/test_trap 

Pero si le preguntas sólo para los jefes de dicho remoto:

[email protected]:~/ce/ce6/.git$ git ls-remote --heads origin 
8598d26b4a4bbe416f46087815734d49ba428523 refs/heads/master 
38325f657380ddef07fa32063c44d7d6c601c012 refs/heads/test_trap 

Respuesta final:

[email protected]:~/ce/ce6/.git$ git ls-remote --heads origin | sed 's?.*refs/heads/??' 
master 
test_trap 

(Sí, usa sed, pero la salida de un comando de plomería se supone que es estable eno ugh para ser analizado)

+0

Luce increíble. Gracias por una respuesta exhaustiva. –

+3

Podría haber respondido esto también, pero ¿qué sucedió con la regla "no sed"? jajaja, cualquiera que sea – KurzedMetal

+3

@KurzedMetal verdadero, pero justifiqué cuidadosamente el uso de 'sed' usando solo el comando de plomería, en lugar de un comando de porcelana como' git branch'. Ver por ejemplo http://stackoverflow.com/questions/2978947/how-to-list-all-the-log-for-current-project-in-git/2979124#2979124 o http://stackoverflow.com/questions/2976665/git-changelog-day-by-day/2976776 # 2976776 – VonC

2

La respuesta existente usa algo explícitamente no deseado en la pregunta (sed) y es un comando remoto.

yo encontramos este que evita esas dos cuestiones, utiliza sólo los comandos git locales y una tubería:

git rev-parse --remotes=origin | git name-rev --name-only --stdin 

actualización: En realidad no óptima o bien, pero manteniéndola si alguien sabe cómo mejorarlo. Enumera el control remoto completo incluyendo el prefijo /remotos/origen si no tiene una sucursal local, pero solo el nombre local si lo tiene. Además, parece omitir algunos refs si hay varios que apuntan al mismo SHA1.

3

Un método alternativo, después de algunas investigaciones en el mismo problema, es:

git for-each-ref --format='%(refname:strip=2)' refs/remotes/<remote_name> 

Esto le dará una lista ordenada de los árbitros locales para la llamada remota en el punto que la última descabellada.

Puede ajustar esto para sus etiquetas, etc.

Cuestiones relacionadas