git:branch 在使用 AWS Lambda 部署时显示 HEAD 而不是当前分支



我正在使用无服务器插件 git 变量。在我的serverless.yml中,我将环境变量配置为如下:GIT_BRANCH: ${git:branch}在本地调用我的函数时,这会显示正确的分支,但在部署和更高的环境中时,git_branch显示为HEAD。为什么它指向 git 中的HEAD以及如何让它指向正确的分支。

HEAD,像这样用大写写写的,在 Git 中是一个非常特殊的名字。 (事实上,它是如此特殊,以至于如果 Git 存储库中缺少它,Git 拒绝相信该存储库是一个存储库。

HEAD的名称通常"附加到"某个分支名称上。根据定义,HEAD附加到分支名称的操作使该分支成为当前分支。 某个存储库中的每个分支名称都会选择某个特定的提交,当该分支是当前分支时,所选提交就是当前提交。

这是正常的日常模式,您自己将使用带有"附加 HEAD"的 Git: ,以便有一个当前分支来选择当前提交。 但是 Git 有一个替代模式,称为分离 HEAD模式。 此模式不适合正常的日常使用:它主要用于正在进行的git rebase之类的事情,或者用于查看历史提交(而不是最近的提交)。 除非您正在执行由于某种原因而停止的变基操作(例如,因为您告诉它这样做,或者因为您需要解决合并冲突),否则您自己通常不会看到此模式。

但是,构建服务器经常被指示将 Git 置于这种分离的 HEAD 模式。 造成这种情况的原因取决于进行此构建的软件的作者,但其中之一是 Git 中的分支名称特定于每个克隆。 也就是说,您的某个 Git 存储库的克隆包含您的分支名称。 如果我克隆相同的 Git 存储库,我会得到自己的分支名称。 我的仓库中的每个名称都完全在我的控制之下,可能不会引用与 Git 仓库中的名称相同的提交。

但是,Git 存储库中的每个提交都有一个唯一的哈希 ID。 此哈希 ID 是非常大的数字的十六进制表示形式,特定于此特定提交。 如果您进行新的提交,它将获得一个新的、唯一的、以前从未使用过的、永远不会再次使用的哈希 ID。 如果您随后将该提交发送到某个地方(例如,使用git push),则获取此提交的每个 Git 存储库都将使用相同的编号

使用该原始数字,服务器可以告诉 Git 软件检查该特定提交。 这会将 Git 置于分离的 HEAD 模式,使用该特定提交作为当前提交。 因此,这样可以确保服务器正在使用您所说的提交,而无需为其提供分支名称。 服务器的 Git 存储库可能没有正确的名称,但它肯定具有相同的编号

因此,您问题第一部分的答案:

为什么[git branchHEAD]

是"因为服务器软件被设计成这样工作的",第二部分的答案是:

以及如何让它指向正确的分支

可能是"你不能"。 Git 中的分支名称通常是不重要和临时的,并且您的分支名称不是其他人的分支名称,因此当原始哈希 ID 准确时,没有充分的理由使用这些名称。 计算机在这里需要精确。

最新更新