git pre-receive hook无法为服务器上的其他存储库执行git命令

问题描述 投票:0回答:1

我在本地docker上有一个git服务器,在其中托管2个存储库:main.gitsub.gitsubmain存储库中的子模块。他们两个都是光秃秃的。我尝试在我的main存储库中添加一个预接收钩子,该钩子会检查我是否没有引用丢失的子模块修订版(例如,如果有人忘记在推送主存储库之前先推送子模块)。我使用以下脚本:https://gist.github.com/T3sT3ro/902d67f29d2c913b3fef6034776777e0,该脚本是此脚本的稍微固定的版本:https://gist.github.com/bagage/bdca3d4b66d43db7a5e3

很遗憾,此脚本无法正常工作。如果从sub存储库的main挂钩内部启动,则为pre-receive存储库执行的任何git命令都将失败。手动运行时,一切似乎都很好。例如,即使在git log|show存储库中手动运行bad object HEAD也会按应有的方式运行,但执行git branch会导致fatal: missing object 78f5da8ed1f83047d0f68fe17e5eaf86060038c3 for refs/heads/mastergit branch --contains 78f5da8ed1f83047d0f68fe17e5eaf86060038c3中的sub产生:打印* master

为挂钩中的子仓库运行git fsck(设置了调试变量)返回此:

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

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

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

服务器上的git版本:2.17.1

git git-submodules githooks
1个回答
0
投票

结果是,git设置了一些环境变量,并且为了允许git hook在其他仓库中工作,我们需要取消设置一些变量。新增中在另一个仓库上调用git命令之前,unset $(git rev-parse --local-env-vars)解决了该问题。我更新了要点脚本,因此现在应该可以运行。剩下要做的一件事是检查是否取消设置所有这些变量是否不会破坏其他内容(例如,是否有更多子模块等)

© www.soinside.com 2019 - 2024. All rights reserved.