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

Dir*_*irk 25 git

我有一个工作的git repo.但是,我错过了remotes/origin/HEAD -> origin/master打字的时候git branch -a.为什么HEAD丢失了,如何将丢失的HEAD添加到我的仓库?

Nev*_*nel 36

原答案:

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

在大多数情况下,远程存储库应该是裸存储库,而裸存储库HEAD只是指向"默认"分支.这只是一次相关:克隆时.因此,在克隆之后,任何远程HEADs对您的克隆都不再重要,Git将不会从任何远程获取该引用.


正如用户lesmana所要求的那样,我再次研究了这一点以找到更多信息:

"怎么删除origin/HEAD?"

你不必这样做.

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

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

git update-ref -d refs/remotes/origin/HEAD
Run Code Online (Sandbox Code Playgroud)

(如果要删除未打开的远程HEAD origin,请改用相应的遥控器名称).

"怎么创造origin/HEAD?"

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

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

git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/master
Run Code Online (Sandbox Code Playgroud)

"为什么远程HEAD不会被克隆自动删除,如果它真的没用?"

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

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

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

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

例如,man git clone说:

--branch <name>
-b <name>

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

--[no-]single-branch

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

此外,man gitrepository-layout说:

HEAD

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

这意味着

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

  • 从用户视角来看,origin/HEAD 非常有用。例如,我有这个别名:`git w='log --graph origin/HEAD..'`,它基本上告诉我一旦我的分支被推送,我的 PR 将包含什么,独立于哪个分支是当前存储库中的主要分支(开发、主控、主控)。 (3认同)
  • 非常感谢你.如果可以的话,我会再次投票给你. (2认同)
  • `git update-ref -d refs/remotes/origin/HEAD` 将删除 `refs/remotes/origin/HEAD` 和 `refs/remotes/origin/`。要仅删除 HEAD,您可以使用“git remote set-head origin --delete”。 (2认同)

pra*_*att 8

refrefs/remotes/origin/HEAD不仅对于克隆有用。如果您的 Git 存储库包含子模块,则这是必需的。命令git submodule update --remote期望您的子模块应该有它:

$ git submodule update --remote
fatal: Unable to find refs/remotes/origin/HEAD revision in submodule path 'submodule-name'
Run Code Online (Sandbox Code Playgroud)

因此,还有一种方法可以设置或删除默认分支( ref 的目标refs/remotes/origin/HEAD)。

查询远程以确定默认分支并将其设置为 ref refs/remotes/origin/HEAD

git remote set-head origin -a
Run Code Online (Sandbox Code Playgroud)

对于批量操作(对所有子模块执行):

git submodule foreach git remote set-head origin -a
Run Code Online (Sandbox Code Playgroud)

将 refrefs/remotes/origin/HEAD显式设置为其他现有分支(例如develop):

git remote set-head origin develop
Run Code Online (Sandbox Code Playgroud)

删除参考refs/remotes/origin/HEAD

git remote set-head origin -d
Run Code Online (Sandbox Code Playgroud)

查看此处了解更多详细信息:

  1. https://www.sjoerdlangkemper.nl/2021/10/15/git-submodule-update-remote-retrieves-default-branch- except-when-changed/
  2. https://git-scm.com/docs/git-remote#Documentation/git-remote.txt-emset-headem

  • TLDR:“git 远程 set-head origin --auto”。这应该是公认的答案。 (4认同)