如何在git仓库中添加缺少的原点/ HEAD

时间:2013-07-14 12:28:18

标签: git

我有一个正在运行的git repo。但是,在输入remotes/origin/HEAD -> origin/master时,我会错过git branch -a。为什么缺少HEAD,如何将丢失的HEAD添加到我的仓库?

1 个答案:

答案 0 :(得分:35)

原始答案:

只有克隆回购时才会获取原点HEAD。如果您另外添加遥控器(例如,使用git remote add或重命名另一个现有遥控器),此参考号将不存在,因为没有理由拥有它。

在大多数情况下,远程回购应为bare repos,而在裸回购HEAD中仅指向“默认”分支。这只是一次相关:克隆时。因此,在克隆之后,任何远程HEAD对您的克隆都不再重要,Git将不会从任何远程获取该引用。


当用户 lesmana 请求时,我再次查看此信息以查找更多信息:

“如何删除origin/HEAD?”

您不必这样做。

ref对你的repo操作方式没有影响,而ref实际上只是文件系统上的一个小文本文件,所以它几乎不占用空间(只需几个字节)。

如果您仍想删除它,可以使用

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

(如果您要删除不在origin上的远程HEAD,请改用相应的遥控器名称。)

“如何创建origin/HEAD?”

如前所述,远程HEAD ref仅用于克隆,Git以后从未需要。除非你手动使用它(它看起来不太有用,你可以使用它指向的分支),没有理由手动创建它。

然而,如果你绝对必须,你可以使用

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

“为什么远程HEAD不能通过克隆自动删除,如果它真的没用?”

除了可以告诉用户明确哪个分支被认为是克隆的远程仓库中的默认分支之外,没有具体的理由。但是,正如我上面提到的,它的存在不会造成任何问题并且几乎不占用空间,因此没有真正的理由将其删除。

有关详细信息,请随时直接在Git邮件列表中询问Git开发人员:)

“克隆需要它的确切原因是什么?”

没有一个手册页直接解释git clone总是使用它,但它在某些地方发现了侧面提及。

例如,man git clone说:

  

--branch <name>
  -b <name>

     

不是将新创建的HEAD指向克隆存储库的HEAD指向的分支,而是指向<name>分支。 [...]

  

--[no-]single-branch

     

仅克隆导致单个分支的提示的历史记录,由--branch选项或主分支远程的HEAD指向。 [...]

此外,man gitrepository-layout说:

  

HEAD

     

[...]如果存储库没有与任何工作树(即存储库)相关联,则意义不大,但有效的Git存储库必须拥有HEAD文件;一些瓷器可能会用它来猜测存储库的指定“默认”分支(通常是 master )。

这意味着

  • a)远程 repo 本身必须具有HEAD引用(有效),即使它在语义上并不重要(除了指出默认分支)
  • b)git clone使用远程repo的HEAD引用来确定指向本地HEAD的位置(除非您使用--branch指定覆盖)。要使用该ref,它必须在本地创建它(因此origin/HEAD)。如上所述,它就不会被删除。