【问题标题】:How to add missing origin/HEAD in git repo如何在 git repo 中添加缺少的原点/HEAD
【发布时间】:2013-07-12 10:34:21
【问题描述】:

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

【问题讨论】:

    标签: git


    【解决方案1】:

    原答案:

    只有在您克隆 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
    

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

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

    有关更多详细信息,请随时直接在 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)。

    这意味着

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

    【讨论】:

    • 您能详细说明一下吗?如何删除它?真的没用吗?即使没有用,如何创建它?奖励:如果它真的没用,为什么它不会被克隆自动删除?克隆需要它的确切原因是什么?
    • git update-ref -d refs/remotes/origin/HEAD 将同时删除 refs/remotes/origin/HEADrefs/remotes/origin/。要仅删除 HEAD,您可以使用 git remote set-head origin --delete
    • 关于“远程 HEAD ref 仅用于克隆,以后 Git 不再需要”——也许不是严格要求,但我认为在某些情况下它是有帮助的.如果没有定义远程 HEAD,一些常用的git diff 命令会失败。有关示例,请参阅fatal: ambiguous argument 'origin': unknown revision or path not in the working tree。当然,所讨论的 diff 命令是简写形式,当以更完整的形式编写时,无论是否设置了远程 HEAD,都会成功。
    猜你喜欢
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2020-01-19
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    相关资源
    最近更新 更多