Question

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 état de tête détaché, tel que dans la phase de pochette de poche dans un Jenkins Maven Build(ou dans une récupération de Travis Git), ces commandes ne fonctionnent pas.

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 de son embout de tête.Cela fonctionne bien, mais je sens que quelqu'un avec plus fort git-fu pourrait avoir une solution plus jolie?

Était-ce utile?

La solution

A more porcelain way:

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

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

The refs will be listed in the format (HEAD, master) - you'll have to parse it a little bit if you intend to use this in scripts rather than for human consumption.

You could also implement it yourself a little more cleanly:

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

with the benefit of getting the candidate refs on separate lines, with no extra characters.

Autres conseils

I needed a bit different solution for Jenkins because it does not have local copies of the branches. So the current commit must be matched against the remote branches:

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

or without network:

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

It's also worth noting that this might return multiple branch names when you have multiple branch heads at the same commit.

UPDATE:

I just noticed that Jenkins sets GIT_BRANCH environment variable which contains a value like origin/master. This can be used to get git branch in Jenksin too:

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

Obviously discarding (no branch). Of course, you may get an arbitrary number of branches which could describe the current HEAD (including of course none depending on how you got onto no-branch) which might have be fast-forward merged into the local branch (one of many good reasons why you should always use git merge --no-ff).

git symbolic-ref HEAD returns refs/heads/branchname if you are on a branch and errors if you aren't.

Here's git nthlastcheckout, it gets the exact string you used for your nth last checkout from the 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 \"\$@\""

Examples:

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

The shortest I got working on bitbucket pipelines:

git show -s --pretty=%D HEAD | awk '{gsub("origin/", ""); print $2}'
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top