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?
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.
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
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
).
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