web-dev-qa-db-fra.com

Comment trouver la branche git actuelle en détachée HEAD State

Je peux trouver le nom actuel de la branche GIT en faisant l'une de ces:

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

Mais quand dans un détaché HEAD état, tel que dans la phase de pochette de la pochette dans un Jenkins Maven Build (ou dans une récupération de Travis Git), ces commandes ne travail.

Ma solution de travail actuelle est la suivante:

git show-ref | grep $(git log --pretty=%h -1) | sed 's|.*/\(.*\)|\1|' | sort -u | grep -v HEAD

Il affiche n'importe quel nom de branche qui a la dernière validation sur son HEAD. Cela fonctionne bien, mais je pense que quelqu'un avec plus de git-fu pourrait avoir une solution plus jolie?

46
neu242

Une manière plus porcelaine:

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

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

Les réfs seront énumérés dans le format (HEAD, master) - Vous devrez l'analyser un peu si vous avez l'intention de l'utiliser dans des scripts plutôt que de la consommation humaine.

Vous pouvez également la mettre en œuvre un peu plus proprement:

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

avec l'avantage d'obtenir le candidat Refs sur des lignes distinctes, sans caractères supplémentaires.

36
Cascabel

J'avais besoin d'une solution peu différente pour Jenkins car elle n'a pas de copies locales des branches. La commission actuelle doit donc être appariée contre les branches distantes:

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

ou sans réseau:

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

Il convient également de noter que cela pourrait renvoyer plusieurs noms de succursales lorsque vous avez plusieurs têtes de succursales au même titre.

METTRE À JOUR:

Je viens de remarquer que Jenkins se couche GIT_BRANCH variable d'environnement qui contient une valeur comme Origin/master. Cela peut également être utilisé pour obtenir une branche Git à Jenksin:

echo $GIT_BRANCH | cut -d / -f 2
26
Epeli
git branch --contains HEAD

Évidemment jeter (pas de branche). Bien sûr, vous pouvez obtenir un nombre arbitraire de branches pouvant décrire le courant HEAD (y compris bien sûr aucun dépendant de la manière dont vous avez eu la branche sans branche), qui aurait pu être fusionné rapidement dans La branche locale (une des nombreuses bonnes raisons pour lesquelles vous devriez toujours utiliser git merge --no-ff).

9
Seth Robertson

Voici git nthlastcheckout, il obtient la chaîne exacte que vous avez utilisée pour votre nième dernière caisse à partir du reflèvement:

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

Exemples:

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