我正在为一家公司开发一个内部的web应用程序,它托管在一个私人的github存储库中,但是我的大部分开发工作都是在家里的linux桌面上完成的,而这个web服务器托管在公司办公室的一个小型raspberry pi上,它本质上是nginx前端将/api url代理到一个pm2支持的nodejs应用程序。
我通过git push
ing从我的家部署到github存储库,通过git pull
ing部署到服务器中的生产分支。git hook
post-commit
脚本在临时停止生产api服务器之前,在build目录中运行npm安装。在节点上复制_modules目录并运行脚本,该脚本本质上执行git describe --abbrev=0 --tags
以获取版本号并将其存储在.env
文件中,以便生产服务器向其通告其版本客户。
如果我在家里运行git describe,它给出的版本是v4.2.2
,但是在诊所里我得到的是v4.1.17
,我不明白为什么
在下面的图像中,左手部分是gitk --all
在我的主存储库中的输出,在诊所中只有终端访问权限,您可以从右手部分看到使用git log
的几乎相同的图形-缺少与master
或production
分支无关的提交。v4.2.2只有两个提交,而v4.1.17至少还有10个。
为什么git describe会有这样的行为呢?
编辑:我大概知道答案了--在服务器上有一个post-commit钩子,它最终在分支上进行了一次提交,尽管它不应该这样做--它只应该在开发机器上进行。
2条答案
按热度按时间wf82jlnq1#
也许问题的原因是你想让服务器本地生产分支和你的主分支一样,但是它不是。所以每次它拉的时候,它都会做一个新的合并提交。也许服务器应该推出它的版本(如果你想保留的话),或者服务器应该用
git fetch && git reset --hard @{u}
而不是git pull
来获取最新的提交(如果服务器不应该自己提交的话)。xdyibdwo2#
Git 2.40(Q1 2023),阐明了当钩子被调用时,你必须为环境变量做些什么。
这将有助于
git describe
在钩子中的行为符合预期。参见Eric Sunshine (
sunshineco
)(2023年1月9日)。(由Junio C Hamano --
gitster
--合并至commit fc2735f,2023年1月21日)githooks
:讨论国外仓库中的Git操作签署人:埃里克·桑森
确认人:Jeff King
当钩子调用本地存储库以外的存储库中的Git命令时,钩子的作者经常会因为难以诊断的错误而措手不及。
特别是,引用本地仓库的Git环境变量,如
GIT_DIR
和GIT_WORK_TREE,
,会导致Git命令在本地仓库上操作,而不是在作者想要的仓库上操作。无论环境变量是由用户手动设置还是由Git自己自动设置,都是如此。
当钩子在同一个存储库的不同工作树中调用Git命令时,也会出现同样的问题。
建议避免这个问题的最佳实践$是钩子在调用外部仓库或其他工作树中的Git命令之前确保Git变量是未设置的:
然而,这一建议在任何地方都没有记录。
通过在
githooks.txt
文档中提及来纠正此缺陷。另见:
GIT_DIR
in aliases"git worktree add
' in 'pre-commit
' hook"rev-parse --show-toplevel
broken during exec'ed rebase?"git status
inpre-commit
hook when providing a pathspec on commit"githooks
现在在其手册页中包括:导出环境变量,如
GIT_DIR
、GIT_WORK_TREE
等,以便钩子运行的Git命令可以正确定位仓库。如果钩子需要调用外部仓库或同一仓库的不同工作树中的Git命令,那么它应该清除这些环境变量,这样它们就不会干扰外部位置的Git操作。
例如: