Как добавить отсутствующее начало /HEAD в репозиторий git

У меня есть рабочий репозиторий git. Тем не менее, я пропускаю remotes/origin/HEAD -> origin/master при вводе git branch -a. Почему отсутствует HEAD и как я могу добавить отсутствующий HEAD в мое репо?

Ответы

Ответ 1

Исходный ответ:

Происхождение HEAD выводится только при клонировании репо. Если вы в противном случае добавили удаленный (например, с помощью git remote add или переименовав другой существующий пульт), эта ссылка не будет существовать, , потому что нет причин для ее использования.

В большинстве случаев удаленные репозитории должны быть голыми репозиториями, а в голых репозиториях HEAD просто указывается на ветку "по умолчанию". Это актуально только в одно время: при клонировании. Поэтому после клонирования любой удаленный HEAD больше не важен для вашего клона, а Git не будет извлекать эту ссылку с любого пульта.


Как запросил пользователь lesmana, я снова просмотрел эту информацию, чтобы найти дополнительную информацию:

"Как удалить origin/HEAD?"

Вам не обязательно это делать.

Ссылка не влияет на то, как работает ваше репо, а ref - буквально просто небольшой текстовый файл в вашей файловой системе, поэтому он занимает почти не место (всего несколько байтов).

Если вы все еще хотите удалить его, вы можете использовать

git update-ref -d refs/remotes/origin/HEAD

(если вы хотите удалить удаленный HEAD, который не находится на origin, вместо этого используйте соответствующее удаленное имя).

"Как создать origin/HEAD?"

Как указывалось ранее, удаленный HEAD ref используется только для клонирования и никогда не требуется Git в более позднее время. Если вы его вручную не используете (что не очень полезно, вы можете просто использовать ветвь, на которую она указывает), нет причин для ее создания вручную.

Тем не менее, если вы абсолютно уверены, вы можете использовать

git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/master

"Почему удаленная HEAD не удаляется автоматически клоном, если это действительно бесполезно?"

Нет никакой конкретной причины, из того, что я могу сказать, кроме того, что явным образом информирую пользователя о том, какая ветка считается ветвью по умолчанию в клонированном удаленном репо. Однако, как я уже упоминал выше, его существование не вызывает проблем и почти не имеет места, поэтому нет реальной причины его удалить.

Для получения дополнительной информации не стесняйтесь обращаться к Git разработчикам непосредственно в список рассылки Git:)

"Какова конкретная причина, по которой клон нуждается в этом?"

Ни одна из страниц man не объясняет напрямую, что git clone всегда использует это, но в некоторых местах обнаруживает побочные упоминания.

Например, man git clone говорит:

--branch <name>
-b <name>

Вместо того, чтобы указывать вновь созданную HEAD на ветку, на которую указывают клонированные репозитории HEAD, вместо этого укажите ветку <name>. [...]

и

--[no-]single-branch

Клонировать только историю, ведущую к кончику одной ветки, либо указанную опцией --branch, либо первичные удаленные точки HEAD. [...]

Кроме того, man gitrepository-layout говорит:

HEAD

[...] Это не значит, что если репозиторий не связан ни с каким рабочим деревом (то есть с открытым репозиторием), но в действительном репозитории Git должен иметь HEAD файл; некоторые фарфоры могут использовать его для угадывания назначенной ветки "по умолчанию" репозитория (обычно это мастер).

Это означает, что

  • a) у самого удаленного репо должен быть READ HEAD (действительный), хотя он не имеет семантического значения (кроме указания ветки по умолчанию)
  • b) git clone использует удаленный репозиторий HEAD ref, чтобы определить, где указать локальный HEAD (если вы не указали переопределение с помощью --branch). Чтобы работать с этим ref, он должен локально создать его (поэтому origin/HEAD). Как упоминалось выше, он просто не удаляется.