Как найти текущую ветвь 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
и удалять предостерегающий комментарий для переводчиков.
Удалите (
из локализуемой части сообщений, чтобы сортировка происходила правильно, независимо от локали.