Как найти текущую ветвь git в отдельном состоянии HEAD

Я могу найти текущее имя ветки git, выполнив одно из следующих действий:

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

Но в отдельном состоянии HEAD, например, на этапе посткомпоновки в сборке Jenkins maven (или в git-выборке Travis), эти команды не работают.

Мое текущее рабочее решение таково:

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

Он отображает любое имя ветки, в заголовке которого есть последний коммит. Это работает нормально, но я чувствую, что у кого-то с более сильным гитфу может быть более красивое решение?

Ответ 1

Более фарфоровый путь:

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

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

Ссылка будет указана в формате (HEAD, master) - вам придется немного разобрать ее, если вы намереваетесь использовать ее в сценариях, а не для потребления человеком.

Вы также можете реализовать его немного более чисто:

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

с целью получения ссылок кандидата на отдельные строки без дополнительных символов.

Ответ 2

Мне нужно было немного другое решение для Дженкинса, потому что у него нет локальных копий ветвей. Поэтому текущая фиксация должна быть сопоставлена ​​с удаленными ветвями:

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

или без сети:

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

Также стоит отметить, что это может возвращать несколько названий ветвей, когда у вас есть несколько ветвей разветвления при одном и том же коммита.

UPDATE:

Я только заметил, что Дженкинс устанавливает переменную среды GIT_BRANCH, которая содержит значение, подобное origin/master. Это можно использовать для получения ветки git в Дженсине:

echo $GIT_BRANCH | cut -d / -f 2

Ответ 3

git branch --contains HEAD

Очевидно, что отбрасывание (без ветвления). Конечно, вы можете получить произвольное количество ветвей, которые могли бы описывать текущую HEAD (включая, конечно, ни одно в зависимости от того, как вы попали на не-ветку), которые могли бы быть быстро перешли в локальную ветвь (одна из многих веских причин почему вы всегда должны использовать git merge --no-ff).

Ответ 4

git symbolic-ref HEAD возвращает refs/heads/branchname, если вы на ветке и ошибки, если вы этого не сделали.

Ответ 5

Здесь git nthlastcheckout, он получает точную строку, которую вы использовали для последней n-ой выписки из 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 \"\[email protected]\""

Примеры:

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

Ответ 6

Теперь это должно быть проще с Git 2.23 (Q3 2019), так как " git branch --list " научился всегда выводить отсоединенный HEAD в качестве первого элемента (когда, конечно, HEAD отсоединен), независимо от локали.
(Это происходит в дополнение к показу проверенных веток)

Затем вы можете сравнить эту запись с git branch --show-current (Git 2.22)

См. Коммит 28438e8 (18 июня 2019 г.) Мэтью matvore (matvore).
dscho: Йоханнес dscho (dscho) и Джонатан Нидер (artagnon).
(Объединено Junio C Hamano - gitster - в коммите 92f66fd, 09 июля 2019 г.)

ref-filter: сначала сортировать отдельные строки HEAD

Перед этим патчем " git branch " помещал строки " (HEAD detached...) " и " (no branch, rebasing...) " перед всеми остальными ветками в большинстве случаев, за исключением случаев использования сообщений на китайском языке.
zh_CN как правило, использует символ " ( " на всю ширину ( кодовая точка FF08), чтобы соответствовать пропорциям китайских символов на всю ширину, и переведенные строки, которые мы использовали, использовали их. Это означало, что отсоединенная строка HEAD будет появляться после всех локальных ссылок и даже после удаленных ссылок, если таковые были.

AFAIK, иногда нет ничего страшного в том, чтобы увидеть круглые скобки половинной ширины в тексте "полной ширины", как в языках CJK, например, когда нет символов, предшествующих или следующих за фрагментом текста в скобках.
Удаляя скобки из локализуемого текста, мы можем делиться строками с wt-status.c и удалять предостерегающий комментарий для переводчиков.

Удалите ( из локализуемой части сообщений, чтобы сортировка происходила правильно, независимо от локали.