2011-05-19 12 views
26

puedo encontrar el nombre actual git branch mediante una de las siguientes:Cómo encontrar el git branch actual en el estado de cabeza separada

git branch | awk '/^\*/ { print $2 }' 
git describe --contains --all HEAD 

Pero cuando se encuentra en un estado de cabeza separada, como en la fase posterior a la acumulación en una compilación maven Jenkins (o en una recuperación de Travis git), estos comandos no funcionan.

Mi solución de trabajo actual es la siguiente:

git show-ref | grep $(git show-ref -s -- HEAD) | sed 's|.*/\(.*\)|\1|' | grep -v HEAD | sort | uniq 

nos permite visualizar cualquier nombre de la sucursal que tiene la última confirmación de su punta de la cabeza. Esto funciona bien, pero creo que alguien con git-fu más fuerte podría tener una solución más bonita.

+7

"git branch [...] actual en HEAD separado" - HEAD separado significa que no hay una bifurcación actual, entonces qué rama está tratando de encontrar? – poke

+3

@poke: El ejemplo de OP deja bastante claro lo que está buscando. – Cascabel

+0

@Jefromi: Lo sé, pero no es una buena idea pedir algo y definirlo por una solución que ya funciona. No todos pueden leer eso para ver qué tipo de resultado sale. – poke

Respuesta

21

Una forma más de porcelana:

git log -n 1 --pretty=%d HEAD 

# or equivalently: 
git show -s --pretty=%d HEAD 

se enumeran los árbitros en el formato (HEAD, master) - que tendrá que analizar un poco si tiene intención de utilizar esto en lugar de guiones para el consumo humano.

También se puede aplicar por sí mismo un poco más limpia:

git for-each-ref --format='%(objectname) %(refname:short)' refs/heads | awk "/^$(git rev-parse HEAD)/ {print \$2}" 

con el beneficio de obtener los árbitros candidatos en líneas separadas, sin caracteres adicionales.

+0

Puede usar '--pretty =% D' para obtener' HEAD, branchname' sin los parens circundantes. Probado en git v2.11.0 –

+0

asegúrese de estar mirando las referencias de origen en jenkins y no las referencias locales como lo señala @epeli –

3
git branch --contains HEAD 

Obviamente descartado (sin ramificación). Por supuesto, puede obtener un número arbitrario de sucursales que podrían describir el HEAD actual (incluido, por supuesto, ninguno según cómo llegó a no-branch) que podría haberse fusionado en la sucursal local (una de muchas buenas razones) por qué siempre debes usar git merge --no-ff).

+2

No funciona, solo dice "* (sin rama)" – neu242

+0

@ neu242: Cuál El comando de la otra respuesta devuelve una rama útil (p. ej., no HEAD) donde este comando no (si es una rama remota, agregar -a)? Funciona bien durante la prueba 'git checkout @ {0}' –

+1

Todas las respuestas de @ Jefromi, más mi "solución de trabajo actual" devuelve ramas útiles en un estado HEAD separado. – neu242

0

git symbolic-ref HEAD devuelve refs/heads/branchname si se encuentra en una rama y errores si no lo es.

17

Necesitaba una solución un poco diferente para Jenkins porque no tiene copias locales de las ramas. Por lo que el actual commit debe ser comparada con las ramas remotas:

git ls-remote --heads origin | grep $(git rev-parse HEAD) | cut -d/-f 3 

o sin red:

git branch --remote --verbose --no-abbrev --contains | sed -rne 's/^[^\/]*\/([^\ ]+).*$/\1/p' 

Es también digno de mención que esto podría devolver varios nombres de rama cuando se tienen varios directores de las sucursales al mismo cometer.

ACTUALIZACIÓN:

Acabo de notar que Jenkins establece GIT_BRANCH variable de entorno que contiene un valor como origin/master.Esto puede ser utilizado para obtener git branch en Jenksin también:

echo $GIT_BRANCH | cut -d/-f 2 
1

Aquí está git nthlastcheckout, se pone la cadena exacta que utilizó para su enésimo último pago y envío de la reflog:

git config --global alias.nthlastcheckout '!nthlastcheckout'"() { 
     git reflog | 
     awk '\$3==\"checkout:\" {++n} 
      n=='\${1-1}' {print \$NF; exit} 
      END {exit n!='\${1-1}'}' 
}; nthlastcheckout \"\[email protected]\"" 

Ejemplos:

$ git nthlastcheckout 
master 
$ git nthlastcheckout 2 
v1.3.0^2