【发布时间】:2013-07-12 10:34:21
【问题描述】:
我有一个工作的 git repo。但是,我在输入git branch -a 时错过了remotes/origin/HEAD -> origin/master。为什么 HEAD 丢失了?如何将丢失的 HEAD 添加到我的 repo 中?
【问题讨论】:
标签: git
我有一个工作的 git repo。但是,我在输入git branch -a 时错过了remotes/origin/HEAD -> origin/master。为什么 HEAD 丢失了?如何将丢失的 HEAD 添加到我的 repo 中?
【问题讨论】:
标签: git
只有在您克隆 repo 时才会获取来源的 HEAD。如果您以其他方式添加遥控器(例如,通过使用 git remote add 或通过重命名另一个现有遥控器),则此 ref 将不存在,因为没有理由拥有它。
在大多数情况下,远程存储库应该是bare repos,而在裸存储库中,HEAD 仅指向“默认”分支。这仅在一次相关:克隆时。因此,克隆后,任何远程 HEADs 对您的克隆不再重要,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
据我所知,除了明确告知用户哪个分支被视为克隆远程仓库中的默认分支外,没有具体原因。但是,正如我上面提到的,它的存在不会造成任何问题,并且几乎不占用空间,因此没有真正的理由将其删除。
有关更多详细信息,请随时直接在 Git 邮件列表中询问 Git 开发人员 :)
没有任何手册页直接说明 git clone 总是使用它,但它在某些地方发现了旁白。
例如,man git clone 说:
--branch <name>-b <name>不要将新创建的 HEAD 指向克隆存储库的 HEAD 指向的分支,而是指向
<name>分支。 [...]
和
--[no-]single-branch仅克隆指向单个分支尖端的历史记录,由
--branch选项指定或主分支远程的 HEAD 指向。 [...]
此外,man gitrepository-layout 说:
HEAD[...] 如果存储库与任何工作树(即 bare 存储库)无关,这并没有多大意义,但一个有效的 Git 存储库必须拥有
HEAD文件;一些瓷器可能会使用它来猜测存储库的指定“默认”分支(通常是 master)。
这意味着
git clone 使用远程 repo 的 HEAD ref 来确定指向本地 HEAD 的位置(除非您使用 --branch 指定覆盖)。要使用该 ref,它必须在本地创建它(因此 origin/HEAD)。如上所述,它不会被删除。【讨论】:
git update-ref -d refs/remotes/origin/HEAD 将同时删除 refs/remotes/origin/HEAD 和 refs/remotes/origin/。要仅删除 HEAD,您可以使用 git remote set-head origin --delete。
git diff 命令会失败。有关示例,请参阅fatal: ambiguous argument 'origin': unknown revision or path not in the working tree。当然,所讨论的 diff 命令是简写形式,当以更完整的形式编写时,无论是否设置了远程 HEAD,都会成功。