Git问题(头指向未出生的分支(主分支))

Git问题(头指向未出生的分支(主分支)),git,Git,我有一个带有“master”分支的Git存储库。 不久前(几个月),我们停止使用master,并创建了一个新的分支,所有工作都在这个分支上完成 我现在正在用git建立源代码索引,出于某种原因,我在新分支中看到了一些奇怪的东西: 运行git日志失败: 致命:错误的默认版本“HEAD” 运行git fsck会导致以下结果: 注意:头指向未出生的分支(主分支)注意:无默认值 挂起提交81f11e0b99ad38ecc8502bbed171d2bdfcaa6476的引用 我认为这个存储库/分支有问题

我有一个带有“master”分支的Git存储库。 不久前(几个月),我们停止使用master,并创建了一个新的分支,所有工作都在这个分支上完成

我现在正在用git建立源代码索引,出于某种原因,我在新分支中看到了一些奇怪的东西:

  • 运行git日志失败:

    致命:错误的默认版本“HEAD”

  • 运行git fsck会导致以下结果:

    注意:头指向未出生的分支(主分支)注意:无默认值 挂起提交81f11e0b99ad38ecc8502bbed171d2bdfcaa6476的引用

  • 我认为这个存储库/分支有问题,这导致了源索引脚本的问题

    有什么想法吗?
    (请注意,这里真正的问题是源索引脚本无法获取它试图使用git show查找的对象id,它表示不存在此类对象)。

    您不必拥有主分支,但在任何git存储库中都必须拥有“默认”分支。在非裸存储库中,这是签出分支,而在裸存储库中,这只是意味着它是克隆的默认签出分支

    此默认分支称为
    HEAD
    ,必须始终存在于有效的git存储库中。如果已删除头指向的分支,则可以使用以下命令将其重置为有效分支:

    git symbolic-ref HEAD refs/heads/new-main-branch
    

    这件事发生在我身上是因为腐败,而@CBBailey的回答一开始并不奏效

    要修复以前从工作克隆中推送的损坏,请执行以下操作:

    git push origin :refs/heads/master
    
    这导致裸回购的
    refs/heads/
    目录为空,因此我遇到了
    HEAD
    指向“未出生分支”的问题。在我的案例中,这是通过再做一次来解决的:

    git push --all
    
    这将
    refs/heads/master
    放回原位,因此
    HEAD
    再次工作

    在非裸存储库中,这是签出分支,而在裸存储库中,这只是意味着它是克隆的默认签出分支

    Git现在会知道默认分支是否还不存在

    在Git 2.31(2021年第1季度)中,“”()尝试在完成后本地签出远程存储库负责人指向的分支,但在复制空存储库时,协议没有传递执行此操作所需的信息。
    协议v2学会了如何做到这一点

    参见(2021年2月5日)by.
    (于2021年2月17日合并)

    :报告symrefs的未出生目标 签字人:Jonathan Tan

    克隆时,我们根据远程头选择默认分支。
    但是,如果没有报告远程头(如果远程头的目标未出生,则可能发生这种情况),我们将返回使用本地
    init.defaultBranch

    (这就是所提到的)

    传统上,这并不是什么大事,因为大多数回购协议都使用“
    master
    ”作为默认值

    但如今,如果服务器和客户端实现选择不同的值,则可能会导致混淆(例如,如果远程设备以“
    main
    ”开头,我们可能会在本地选择“
    master
    ”,在那里创建提交,然后当用户推到“
    master
    ”而不是“
    main
    ”)时,用户会感到惊讶

    要解决此问题,遥控器需要与头部symref的目标进行通信,即使头部symref尚未出生,,并且“()”需要使用此信息

    目前,具有未出生目标的SYMREF(例如在本例中)不通过协议进行通信

    在“
    ls refs
    中教Git播发并支持“未出生”功能(默认情况下,这是播发的,但服务器管理员可以通过
    lsrefs.unborn
    配置将其关闭)。
    此功能表示“
    ls refs
    ”支持“
    未出生的
    ”参数;指定后,“
    ls refs
    ”将发送头部symref及其未出生目标的名称

    此更改仅适用于协议v2。
    协议v0的类似更改将需要独立的协议设计(没有类似的位置来表示对“未出生”的支持)和所需数据的客户端管道,因此此补丁集的范围仅限于协议v2

    客户端将被更新,以便在后续提交中使用它

    git config
    现在在其

    lsrefs.未出生
    可以是“
    播发”
    ”(默认)、“
    允许”
    ”或“
    忽略”

    如果是“广告”, 服务器将响应客户端发送“
    未出生”
    ”(如中所述)
    protocol-v2.txt
    ),并将在 协议v2功能公告。
    允许”
    ”与 “
    播发
    ”但服务器不会播发对此的支持 特征;这对于无法运行的负载平衡服务器非常有用 原子更新(例如),因为管理员可以 配置“
    允许”
    ”,然后在延迟后配置“
    播发”

    technical/protocol-v2
    现在包括在its中:

    如果发布了“
    未出生的
    ”功能,则可以使用以下参数 包括在客户的请求中

    未出生

    服务器将发送有关HEAD的信息,即使它是symref 以“
    未出生的头部symref目标:
    ”的形式指向未出生的分支

    technical/protocol-v2
    现在包括在its中:

    obj id或unborn=(obj id |“unborn”)

    ref=PKT-LINE(obj id或未出生的SP refname*(SP ref属性)LF)


    同样,此功能仅在使用协议v2时可用,如Git 2.31.1(Q1 2021)所示:

    参见(2021年3月17日)作者 (于2021年3月19日合并)

    :使用协议v2运行克隆分支名称测试 签字人:Jonathan Tan

    (“
    克隆
    :尊重
    git -c init.defaultBranch=foo init --bare empty
    git -C empty config lsrefs.unborn advertise
    git -c init.defaultBranch=up -c protocol.version=2 clone empty whats-up