为什么git describe要选择特定的标签进行描述

4
我正在为一家公司开发一个内部网站应用程序。它托管在私有的github存储库中,但我的大部分开发工作都是在我家的Linux桌面上完成的,而这个网络服务器则托管在公司办公室的一个小型树莓派上。它本质上是nginx前端代理/api url到由pm2支持的nodejs应用程序。

我通过从家里将代码git push到github存储库,再在服务器上git pull生产分支来部署。一个git hook post-commit脚本会在构建目录中运行npm install,然后暂时停止生产api服务器,复制node_modules目录并运行一个脚本,该脚本本质上执行git describe --abbrev=0 --tags以获取并存储版本号到.env文件中,以便生产服务器向客户端宣布其版本。

如果我在家中运行git describe,则会得到版本v4.2.2,但在诊所中我得到v4.1.17,我不知道原因。

在下面的图片中,左侧部分是我家目录库上gitk --all的输出结果,在诊所中只有终端访问权限,你可以从右侧部分看到几乎相同的图形,使用git log - 没有与masterproduction分支无关的提交。 v4.2.2仅相差两个提交,而v4.1.17至少相差10个提交。

为什么git描述会表现出这样的行为?

编辑:我有点知道答案了 - 在服务器上有一个后提交挂钩,最终在分支上做了一个提交,尽管它本不应该这样做 - 它只应该在开发机器上进行。

Composite gitk graph from my git repo


1
这可能与Git在合并提交中如何排序父级有关。我不确定git describe是否始终遵循第一个父级或其他什么规则?我会查阅文档,看看能找到什么信息。 - Chris
1
顺便提一下,问题的原因可能是你希望服务器本地的production分支与你的主分支相同,但实际上它们并不相同。所以每次服务器进行拉取时都会创建一个新的合并提交。也许服务器应该推送它的版本(如果你想保留它),或者,服务器应该使用git fetch && git reset --hard @{u}获取最新版本,而不是使用git pull。(如果服务器不应该进行自己的提交。) - TTT
1
很难描述git describe的工作原理。但是对于@Chris的简短评论,git describe默认不仅遵循第一个父级;请参见此问题及其答案。 - torek
2
@TTT,你解决了这个问题。几个版本之前,我的构建脚本中有一个错误,导致在生产服务器上进行了一次提交 - 应该只在开发环境中进行。git reset --hard origin/production 解决了这个问题。 - akc42
1
@TTT,我已经通过对原始/生产环境进行硬重置来完全解决了问题。我有点知道你的问题的答案,因为我已经这样做了。如果我没记错的话,4.1.17距离最新版本还有34个提交,而4.2.2则在70多个提交之后。 - akc42
显示剩余6条评论
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
0

由@TTT在他的评论中回答:

问题的原因可能是您打算将服务器本地生产分支与您的主分支相同,但实际上并不相同。因此,每次进行拉取操作时都会生成一个新的合并提交。也许服务器应该推出它的版本(如果您想保留它),或者,服务器应该使用git fetch && git reset --hard @{u}获取最新版本,而不是使用git pull。(如果服务器不应该自己进行提交。)


0

Git 2.40(2023年第一季度)澄清了钩子调用时必须执行的环境变量设置。
这将有助于git describe在钩子中按预期运行。

请参见提交772f8ff(2023年1月9日),作者为Eric Sunshine(sunshineco
(由Junio C Hamano -- gitster --合并于提交fc2735f,2023年1月21日)

githooks:讨论在外部存储库中的Git操作

签名:Eric Sunshine
确认:Jeff King

钩子作者在钩子调用存储库中的 Git 命令时,经常会遇到难以诊断的错误,尤其是当这些命令在本地存储库之外的存储库中操作时。特别是 Git 环境变量(例如 GIT_DIRGIT_WORK_TREE)引用本地存储库,导致 Git 命令在本地存储库而不是作者预期的存储库上运行。无论用户手动设置还是 Git 自动设置环境变量都是如此。同样的问题也会在钩子在同一存储库的不同工作树中调用 Git 命令时出现。 为了避免这个问题,建议最佳实践是在调用外部存储库或其他工作树中的 Git 命令之前,确保钩子取消设置 Git 变量:
unset $(git rev-parse --local-env-vars)
然而,这个建议没有被记录在任何地方。通过在 githooks.txt 文档中提及它来纠正这个缺陷。 另请参阅:

githooks现在在其手册页面中包含:

Environment variables, such as GIT_DIR, GIT_WORK_TREE, etc., are exported so that Git commands run by the hook can correctly locate the repository.

If your hook needs to invoke Git commands in a foreign repository or in a different working tree of the same repository, then it should clear these environment variables so they do not interfere with Git operations at the foreign location.

For example:

local_desc=$(git describe)
foreign_desc=$(unset $(git rev-parse --local-env-vars); git -C ../foreign-repo describe)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,