Jak znaleźć bieżącą gałąź git w stanie wolnostojącym

Mogę znaleźć bieżącą nazwę gałęzi git, wykonując jedną z następujących czynności:

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

Ale gdy w stanie odłączonej głowy, na przykład w fazie budowania post w Jenkins Maven build (lub w Travis git fetch), polecenia te nie działają.

Moje obecne rozwiązanie robocze Jest Takie:

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

Wyświetla dowolną nazwę gałęzi, która ma ostatni commit na czubku głowy. To działa dobrze, ale wydaje mi się, że ktoś z mocniejszym git-fu może mieć ładniejsze rozwiązanie?

Author: neu242, 2011-05-19

5 answers

Bardziej porcelanowy sposób:

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

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

Refy będą wyświetlane w formacie (HEAD, master) - będziesz musiał je trochę przeanalizować, jeśli zamierzasz używać ich w skryptach, a nie do spożycia przez ludzi.

Mógłbyś też zaimplementować to sam trochę bardziej czysto:

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

Z korzyścią uzyskania referencji kandydata na osobnych liniach, bez dodatkowych znaków.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-19 20:02:58

Potrzebowałem nieco innego rozwiązania dla Jenkinsa, ponieważ nie ma on lokalnych kopii gałęzi. Tak więc bieżący commit musi być dopasowany do odległych gałęzi:

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

Lub bez sieci:

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

Warto również zauważyć, że może to zwrócić wiele nazw gałęzi, jeśli masz wiele głowic gałęzi w tym samym commicie.

Aktualizacja:

Zauważyłem, że Jenkins ustawia zmienną środowiskową GIT_BRANCH, która zawiera wartość origin/master. Można to wykorzystać aby uzyskać Git branch również w Jenksin:

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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-05 07:03:11
git branch --contains HEAD

Oczywiście odrzucanie (bez gałęzi). Oczywiście, możesz otrzymać dowolną liczbę gałęzi, które mogłyby opisywać bieżącą głowicę (w tym oczywiście żaden, w zależności od tego, jak trafiłeś na no-branch), które mogły zostać szybko połączone w lokalną gałąź (jeden z wielu dobrych powodów, dla których powinieneś zawsze używać 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/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-20 02:02:37

git symbolic-ref HEAD zwraca refs/heads/branchname jeśli jesteś na gałęzi i błędy, jeśli nie.

 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/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-31 20:05:15

Oto git nthlastcheckout, pobiera dokładny ciąg, którego użyłeś do n-tej ostatniej kasy z reflogu:

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

Przykłady:

$ 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/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-07 01:20:55