繁体   English   中英

git 预接收挂钩无法为服务器上的其他存储库执行 git 命令

[英]git pre-receive hook fails to execute git commands for other repository on server

我在我的本地 docker 上有一个 git 服务器,我在其中托管 2 个存储库: main.gitsub.git submain仓库中的一个子模块。 两个都是光秃秃的。 我尝试在我的main仓库中添加一个预接收挂钩,以检查我是否没有引用丢失的子模块修订版(例如,如果有人在推送主仓库之前忘记推送子模块)。 I use this script: https://gist.github.com/T3sT3ro/902d67f29d2c913b3fef6034776777e0 which is a slightly fixed version of this one: https://gist.github.com/bagage/bdca3d4b66d43db7a5e3 .

不幸的是,这个脚本不起作用。 如果从main repo 的pre-receive挂钩内部启动,则为sub repo 执行的任何 git 命令都会失败。 当手动运行时,一切似乎都很好。 For example executing git log|show result in bad object HEAD and git branch in fatal: missing object 78f5da8ed1f83047d0f68fe17e5eaf86060038c3 for refs/heads/master , even though running git branch --contains 78f5da8ed1f83047d0f68fe17e5eaf86060038c3 by hand in sub repo works as it should: prints * master .

运行git fsck for sub repo in hook(设置调试变量)返回:

remote: 16:45:32.575940 trace.c:318             setup: git_dir: .
remote: 16:45:32.575961 trace.c:319             setup: git_common_dir: .
remote: 16:45:32.575967 trace.c:320             setup: worktree: (null)
remote: 16:45:32.575971 trace.c:321             setup: cwd: /var/www/git/sub.git
remote: 16:45:32.575976 trace.c:322             setup: prefix: (null)
remote: 16:45:32.575982 git.c:344               trace: built-in: git fsck
remote: error: HEAD: invalid sha1 pointer 78f5da8ed1f83047d0f68fe17e5eaf86060038c3
remote: error: refs/heads/master: invalid sha1 pointer 78f5da8ed1f83047d0f68fe17e5eaf86060038c3
remote: notice: No default references
remote: 16:45:32.580070 read-cache.c:1925       performance: 0.000004548 s: read cache ./index
remote: 16:45:32.580107 trace.c:420             performance: 0.004374272 s: git command: git fsck
remote: dangling commit 468626a3126e8139a08727ff3c1b25f37e23f957

我尝试将钩子的所有者和组更改为与其他文件相同,但它不起作用。 这有点像某种安全机制,但另一方面我可以touch sub仓库中的文件。 从上面的 fsck 日志中,我们还可以看到78f5da...存在于某处...

repro 是这样的:创建 main 和 sub repo,向两者推送一些初始提交,将 sub 作为子模块添加到 main,在 sub 上提交而不推送,在 main 添加 sub(main 现在应该引用 sub repo 的本地提交),尝试推送主仓库(失败 - 预期),推送子仓库,尝试推送主仓库(再次失败 - 现在出现这些错误)。

服务器上的 git 版本:2.17.1

事实证明,git 设置了一些环境变量,并允许 git 挂钩在其他一些 repo 上工作,我们需要取消设置一些变量。 在另一个 repo 上调用 git 命令之前添加unset $(git rev-parse --local-env-vars)可以解决问题。 我更新了 gist 脚本,所以它现在应该可以工作了。 剩下要做的一件事是检查取消设置所有这些变量是否不会破坏其他东西(例如,如果有更多子模块等)

@EDIT在另一个 repo 上调用 git 命令之前添加了两行,修复了此行为。 测试了 2 个子模块和一次推送的许多提交

unset GIT_ALTERNATE_OBJECT_DIRECTORIES
unset GIT_OBJECT_DIRECTORY

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM