33

我有一个工作 git repo。但是,我想念remotes/origin/HEAD -> origin/master输入时的git branch -a. 为什么 HEAD 丢失了,如何将丢失的 HEAD 添加到我的仓库中?

4

1 回答 1

45

原答案:

HEAD仅当您克隆存储库时才会获取原点。如果您以其他方式添加遥控器(例如,通过使用git remote add或重命名另一个现有遥控器),则此引用将不存在,因为没有理由拥有它。

在大多数情况下,远程存储库应该是裸存储库,并且在裸存储库中HEAD仅指向“默认”分支。这仅在一次相关:克隆时。因此,克隆后,任何 remoteHEAD对您的克隆都不再重要,Git 不会从任何远程获取该 ref。


根据用户lesmana 的要求,我再次查看此内容以找到更多信息:

“怎么去掉origin/HEAD?”

您不必这样做。

ref 对 repo 的运行方式没有影响,并且 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 开发人员 :)

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

没有一个手册页直接解释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)远程仓库本身必须具有 HEAD ref(有效),即使它在语义上并不重要(除了指出默认分支)
  • b)git clone使用远程 repo 的 HEAD ref 来确定指向本地的位置HEAD(除非您使用 指定覆盖--branch)。要使用该 ref,它必须在本地创建它(因此origin/HEAD)。如上所述,它不会被删除。
于 2013-07-14T12:42:28.167 回答