Как найти текущую ветку git в отключенном состоянии HEAD - PullRequest
41 голосов
/ 19 мая 2011

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

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

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

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

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

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

Ответы [ 6 ]

34 голосов
/ 20 мая 2011

Более фарфоровый способ:

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}"

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

26 голосов
/ 18 октября 2013

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

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 в Jenksin:

echo $GIT_BRANCH | cut -d / -f 2
9 голосов
/ 20 мая 2011
git branch --contains HEAD

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

2 голосов
/ 01 января 2013

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

1 голос
/ 07 февраля 2015

Вот 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 \"\$@\""

Примеры:

$ git nthlastcheckout
master
$ git nthlastcheckout 2
v1.3.0^2
0 голосов
/ 15 июля 2019

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...