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 准确时使用它们。计算机在这里需要精确。
我正在使用 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
sayHEAD
]
是“因为服务器软件就是这样设计的”,第二部分的答案:
and how can I get it to point to the correct branch
可能是“你不能”。 Git 中的分支名称通常 不重要且临时 并且 您的 分支名称不是其他人的分支名称,因此没有充分的理由当原始哈希 ID 准确时使用它们。计算机在这里需要精确。