Cómo encontrar la rama git actual en el estado HEAD separado


Puedo encontrar el nombre actual de la rama git haciendo cualquiera de estos:

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

Pero cuando se encuentra en un estado HEAD separado, como en la fase de compilación post 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

Muestra cualquier nombre de rama que tenga la última confirmación en su punta PRINCIPAL. Esto funciona bien, pero creo que alguien con git-fu más fuerte podría tener una solución más bonita?

Author: neu242, 2011-05-19

5 answers

Una manera más de porcelana:

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

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

Las referencias se listarán en el formato (HEAD, master) - tendrá que analizarlas un poco si tiene la intención de usar esto en scripts en lugar de para consumo humano.

También podría implementarlo usted mismo un poco más limpio:

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

Con el beneficio de obtener las referencias candidatas en líneas separadas, sin caracteres adicionales.

 25
Author: Cascabel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-19 20:02:58

Necesitaba una solución un poco diferente para Jenkins porque no tiene copias locales de las ramas. Por lo tanto, la confirmación actual debe compararse 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'

También vale la pena señalar que esto podría devolver varios nombres de rama cuando tiene varias cabezas de rama en el mismo commit.

ACTUALIZACIÓN:

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

echo $GIT_BRANCH | cut -d / -f 2
 19
Author: Epeli,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-05 07:03:11
git branch --contains HEAD

Obviamente descartando (sin rama). Por supuesto, puede obtener un número arbitrario de ramas que podrían describir la CABEZA actual (incluyendo, por supuesto, ninguna, dependiendo de cómo llegó a no-branch) que podría haber sido un avance rápido fusionado en la rama local (una de las muchas buenas razones por las que siempre debe usar git merge --no-ff).

 6
Author: Seth Robertson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-20 02:02:37

git symbolic-ref HEAD devuelve refs/heads/branchname si está en una rama y errores si no lo está.

 2
Author: Gaelan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-12-31 20:05:15

Aquí está git nthlastcheckout, obtiene la cadena exacta que usó para su enésima última comprobación del 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 \"\$@\""

Ejemplos:

$ git nthlastcheckout
master
$ git nthlastcheckout 2
v1.3.0^2
 1
Author: jthill,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-07 01:20:55