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

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

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

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

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

6 ответов


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

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

Я нашел способ определить ветвь по умолчанию, если она не является 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, который обозначает ветку по умолчанию)

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


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

git branch -r --points-at refs/remotes/origin/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

есть -- short до git symbolic-ref. Поэтому моя любимая команда:

$ git symbolic-ref --short HEAD
master

кажется немного обходным решением, но это, похоже, работает:

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