Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Git - как получить ветку по умолчанию?

Автор вопроса: lfender6445Ответов: 12

Моя команда чередует использование dev и master в качестве ветки по умолчанию для нескольких репозиториев, и я хотел бы написать скрипт, который проверяет ветку по умолчанию при входе в каталог.

Когда запросы на вытягивание открываются в некоторых из этих репозиториев, они по умолчанию имеют значение "dev" или "master" в качестве цели слияния.

Я понимаю, как установить эту информацию, но не получить ее: https://help.github.com/articles/setting-the-default-branch/

Доступна ли команда git для определения ветки по умолчанию для удаленного репозитория?

  • Ветка по умолчанию - это github, а не git. Ismail Badawi 23.02.2015
  • Вы можете использовать API GitHub, как в этом вопросе: stackoverflow.com/questions/16500461/ Ismail Badawi 23.02.2015
  • @IsmailBadawi Правда? При создании локального голого репо и выполнении его клонирования должна быть какая-то логика, определяющая, какая ветка извлечена по умолчанию, верно? bluenote10 16.07.2019
  • Ни одно из приведенных ниже решений не работает надежно для меня: если я нахожусь в ветке feature, разветвленной из develop, она вернет мне develop, а не master (или main, из которой develop является вилкой)... Любая помощь? user3341592 12.01.2021
  • Вопрос задан в stackoverflow.com/questions/65703168/ user3341592 13.01.2021

gitgithubbranch

Ответы

Ответ 1 · рейтинг 74 · danielkza

Протестировано с git 2.9.4 (но, возможно, работает и в других версиях) в репозитории, клонированном с Github:

$ git symbolic-ref refs/remotes/origin/HEAD | sed 's@^refs/remotes/origin/@@'
master

Ответ 2 · рейтинг 76 · Radon8472

Я нашел способ определить ветку по умолчанию, если она не является главной.

git remote show [your_remote] | sed -n '/HEAD branch/s/.*: //p'

Я протестировал его с несколькими репозиториями из gitlab, и он работал нормально. (в большинстве случаев [your_remote] будет origin, запустите git remote, чтобы проверить имя вашего пульта)

Ответ 3 · рейтинг 18 · Anthony Sottile

Кажется, пока нет ответа, который не требует клонирования.

Для этого требуется git 2.8.0 или новее

$ git ls-remote --symref [email protected]:pre-commit/pre-commit.github.io HEAD
ref: refs/heads/real_master HEAD
e100a6a3c72b4e54f0d176f791dfd2dbd7eb5fa7    HEAD

Ответ 4 · рейтинг 18 · JoeLinux

Этот вопрос немного устарел, но на случай, если кто-то столкнется с этим совсем недавно...

git remote show <remote_name> | awk '/HEAD branch/ {print $NF}'

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

Мне нравится сохранять это, используя пару псевдонимов git (у меня есть куча таких полезных псевдонимов):

upstream-name = !git remote | egrep -o '(upstream|origin)' | tail -1
head-branch = !git remote show $(git upstream-name) | awk '/HEAD branch/ {print $NF}'

Я использую "upstream" и "origin" в качестве пультов почти в 100% случаев ("upstream", когда я использую Fork & Pull... что часто бывает). Ваш вариант использования может не нуждаться в псевдониме upstream-name, я просто считаю его полезным.

Ответ 5 · рейтинг 17 · Jeffrey Yasskin

git rev-parse --abbrev-ref origin/HEAD напечатает origin/<default-branch-name>. Ответы git symbolic-ref делают то же самое, но требуют более длинного аргумента.

Если репозиторий origin изменит имя ветки по умолчанию, то git remote set-head origin -a получит новое имя ветки по умолчанию.

Ответ 6 · рейтинг 3 · Tony Spataro

Это работает для меня с Git 2.1.10, используя репозиторий, клонированный из GitHub:

git branch -r --points-at refs/remotes/origin/HEAD

Основная проблема с этим подходом заключается в том, что он перечисляет каждую удаленную ветвь, указывающую на HEAD; однако вывод включает подсказку:

  origin/HEAD -> origin/master
  origin/master
  origin/test123

Таким образом, вы можете обработать вывод с помощью grep или аналогичного, чтобы найти тот, у которого есть стрелка:

git branch -r --points-at refs/remotes/origin/HEAD | grep '\->' | cut -d' ' -f5 | cut -d/ -f2

Ответ 7 · рейтинг 3 · Christian Hesse

Существует опция --short для git symbolic-ref. Итак, моя предпочтительная команда:

$ git symbolic-ref --short HEAD
master

Ответ 8 · рейтинг 3 · Henrik N

Я просто хотел, чтобы сценарий оболочки знал, является ли ветка главной или основной.

Для этой цели это кажется достаточно хорошим:

[ -f "$(git rev-parse --show-toplevel)/.git/refs/heads/master" ] && echo master || echo main

Если вы знаете, что он всегда будет вызываться из корневого каталога репозитория, его можно упростить до

[ -f .git/refs/heads/master ] && echo master || echo main

Я использую это в своих псевдонимах Git, например: dotfiles/commit/6815bd95770afab2936fb6202b1ee5e82cb9662b

Ответ 9 · рейтинг 3 · Carl Walsh

Если вам нравится этот вопрос, вы пытаетесь получить ветку GitHub по умолчанию, а не какой-либо другой сервер git:

Вы можете получить ветку по умолчанию с помощью /repos GitHub API. Это поле default_branch ответа:

$ curl -s https://api.github.com/repos/darthwalsh/bootstrappingCIL | \
      jq --raw-output .default_branch
master

Ответ 10 · рейтинг 2 · anorm

Похоже на обходное решение, но это, похоже, работает:

$ cat .git/refs/remotes/origin/HEAD
ref: refs/remotes/origin/master

Ответ 11 · рейтинг 2 · Henry

Следующая команда отобразит ветку HEAD, независимо от того, как вы назвали свои пульты:

git branch --remotes --list '*/HEAD'

Из этого вы можете извлечь ветку по умолчанию следующим образом:

git branch -rl '*/HEAD' | rev | cut -d/ -f1 | rev

(используя короткие варианты аргументов git branch).

Ответ 12 · рейтинг 1 · VonC

Нет, вроде нет:

git ls-remote -h https://github.com/<user>/<repo>

Это будет список всех ветвей, но не HEAD (это symref, который обозначает ветвь по умолчанию)

Точно так же GitHub Reference API может отображать заголовки, но также не будет включать HEAD.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы