Ответ 1
Протестировано с помощью git 2.9.4 (но возможно работает в других версиях) в репо, клонированном из Github:
$ git symbolic-ref refs/remotes/origin/HEAD | sed '[email protected]^refs/remotes/origin/@@'
master
Моя команда чередует использование dev и master как ветку по умолчанию для нескольких репозиториев, и я хотел бы написать script, который проверяет ветвь по умолчанию при вводе каталога.
Когда в некоторых из этих репозиториев открываются запросы на загрузку, они по умолчанию устанавливают "dev" или "master" в качестве цели слияния.
Я понимаю, как установить эту информацию, но не получить ее: https://help.github.com/articles/setting-the-default-branch/
Имеется ли команда git для определения ветки по умолчанию для удаленного репозитория?
Протестировано с помощью git 2.9.4 (но возможно работает в других версиях) в репо, клонированном из Github:
$ git symbolic-ref refs/remotes/origin/HEAD | sed '[email protected]^refs/remotes/origin/@@'
master
Я нашел способ обнаружить ветку по умолчанию, если она не является основной.
git remote show [your_remote] | grep "HEAD branch" | cut -d ":" -f 2
Я протестировал его с несколькими репо из gitlab, и он работал нормально.
Имеется ли команда git для определения ветки по умолчанию для удаленного репозитория?
Нет, похоже, нет:
git ls-remote -v https://github.com/<user>/<repo>
Это будет список всех ветвей, но не HEAD (который является symref, который обозначает ветвь по умолчанию)
Аналогично, Справочный API GitHub может отображать заголовки, но также не будет включать HEAD.
Существует опция - short для git symbolic-ref. Поэтому моя предпочтительная команда:
$ git symbolic-ref --short HEAD
master
Это работает для меня с 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
Похоже, это немного обходное решение, но это работает:
$ cat .git/refs/remotes/origin/HEAD
ref: refs/remotes/origin/master
Кажется, нет ответа, который пока не требует клонирования.
Для этого требуется 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