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