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

git:branch shows HEAD instead of the current branch when deployed with AWS Lambda

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

HEAD,这样写的全大写,在Git中是一个很特别的名字。 (它是如此特别,事实上,如果它在 Git 存储库中 缺失 ,Git 拒绝相信该存储库是一个存储库。)

名称HEAD 通常“附加到”某个分支名称。将 HEAD 附加到分支名称的行为使该分支成为 当前分支 根据定义 。某些存储库中的每个分支名称 select 都是一些特定的提交,当该分支是当前分支时,selected 提交是当前提交。

这是正常的日常模式,您自己将使用 Git: 和一个“附加的 HEAD”,以便有一个 select 当前提交的当前分支。但是 Git 有一个替代模式叫做 detached HEAD 模式。这种模式不适合日常使用:它主要用于 in-progress git rebase 之类的事情,或者用于查看历史提交(而不是 most-recent )。除非您正处于由于某种原因停止的变基操作中间——例如,因为您告诉它停止,或者因为您需要解决合并冲突——您通常不会自己看到这种模式。

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

但是,Git 存储库中的每个 提交 都有一个 唯一的 哈希 ID。这个哈希 ID 是一个非常大的数字的 hexadecimal 表示,特定于 这个特定的提交 。如果您进行新的提交,它会获得一个新的、唯一的 never-been-used-before、never-will-be-used-again 哈希 ID。如果您然后 发送 在某处提交——例如,使用 git push- 每个获得此提交的 Git 存储库将使用相同的数字.

使用该原始编号,服务器可以告诉 Git 软件签出 那个特定的提交 。这将 Git 置于分离的 HEAD 模式,使用该特定提交作为 current 提交。这样可以确保服务器正在使用提交 你说要使用 ,而不需要它的分支名称。服务器的 Git 存储库可能没有正确的 名称 ,但它肯定具有 相同的编号

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

Why does [git branch say HEAD]

是“因为服务器软件就是这样设计的”,第二部分的答案:

and how can I get it to point to the correct branch

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