Что определяет ветвь по умолчанию после "git clone"?
Мое понимание заключается в том, что ветвь по умолчанию клонированного репозитория должна быть тем, на что указывает HEAD в клонировании репо.
Теперь у меня есть случай, когда это неверно. Мое понимание явно ошибочно, так что определяет ветку проверки по умолчанию при клонировании (голого) репо?
Последняя фиксация в этом репо была слиянием между веткой, на которую ссылается в голое HEAD HEAD, в ветку, которую я получаю как ветвь проверки в клоне.
Запуск git remote show origin
возвращает:
Fetch URL: ...
Push URL: ...
HEAD branch (remote HEAD is ambiguous, may be one of the following):
<bad-branch>
live
Remote branches:
...
Bare repo использует Git версию 1.8.2.1, клиент использует 1.7.12.4, транспорт - SSH.
Возможно, ответ на самом деле здесь здесь. Этот ответ подтверждает это. Если есть выбор символических ссылок, указывающих на ту же ревизию, что и HEAD, клиент будет угадывать, какую ветвь использовать.
Ответы
Ответ 1
Начиная с Git 1.8.5, сервер отправит фактическое имя ветки, на которое HEAD
указывает, в функции "symref". Если у вас есть как клиент, так и сервер, более новый, чем Git 1.8.5, он правильно обновит HEAD
.
До этого клиент догадывается, на что указывает HEAD, сравнивая идентификатор объекта, который HEAD (в конечном счете) указывает на все идентификаторы объектов всех ветвей. Он предпочитает ветвь с именем refs/heads/master
: если оба HEAD
и master
указывают на один и тот же идентификатор объекта, тогда клон будет устанавливать ветвь по умолчанию в новом репозитории master
.
В противном случае первая ветвь с соответствующим идентификатором OID (когда ветки сортируются по алфавиту) будет ветвью по умолчанию. Если ни одна из ветвей не имеет соответствующих идентификаторов OID, то HEAD
будет задаваться непосредственно идентификатору объекта (т.е. Отдельному HEAD).
Ответ 2
Это на самом деле то, что указывает HEAD. Используйте git symbolic-ref HEAD refs/heads/mybranch
для установки HEAD.
(источник: http://feeding.cloud.geek.nz/posts/setting-default-git-branch-in-bare/)
Ответ 3
Голый репо имеет также HEAD
. Это то, что вы получаете, когда клонируете его.
Из git clone
документация:
Клонирование репозитория во вновь созданном каталоге, создает ветки удаленного отслеживания для каждой ветки в клонированном репозитории (видимые с помощью git branch -r
) и создает и проверяет начальную ветвь, которая разветвляется из активной активной ветки клонированного репозитория.
Бит о "активной активной ветки" относится к удаленной версии HEAD
.
Если вам нужно другое поведение, вы можете использовать --branch
или -b
:
--branch <name>
-b <name>
Вместо указания вновь созданного HEAD
на ветку, на которую указывают клонированные репозитории HEAD
, вместо этого укажите на ветвь <name>
. В не-голом репозитории это ветка, которая будет проверена. --branch
также может принимать теги и отделяет HEAD
от этого фиксации в результирующем репозитории.