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

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

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

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

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

Ответ 1

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

$ git symbolic-ref refs/remotes/origin/HEAD | sed '[email protected]^refs/remotes/origin/@@'
master

Ответ 2

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

git remote show [your_remote] | grep "HEAD branch" | cut -d ":" -f 2

Я протестировал его с несколькими репо из gitlab, и он работал нормально.

Ответ 3

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

Нет, похоже, нет:

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

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

Аналогично, Справочный API GitHub может отображать заголовки, но также не будет включать HEAD.

Ответ 4

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

$ git symbolic-ref --short HEAD
master

Ответ 5

Это работает для меня с 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

Ответ 6

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

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

Ответ 7

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

Для этого требуется 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