首页 > 解决方案 > Git pre-receive hook newRev 问题

问题描述

在执行 pre-receive 钩子时git show $newrev显示 diff in$newRev但是如果在执行pre-receive钩子时我会去 repo 并执行相同的命令git show $newrev,它将返回 error fatal: bad object {newRev}

Git 版本:2.22.0。在 Git 2.7.4git show上,在 repo 中执行不会返回错误。

pre-receive hook script何时git show正常工作

#!/usr/bin/env bash
read oldrev newrev refname

git show $newrev

pre-receive hook scriptgit show带睡眠并在 repo 中手动运行

#!/usr/bin/env bash
read oldrev newrev refname

sleep 999
cd /repo
git show ae435ae1f9de55620d306cc82799ff20870f4238

致命:坏对象ae435ae1f9de55620d306cc82799ff20870f4238

标签: gitgithooks

解决方案


经过调查,我了解到 Git in pre-receivehook 创建了单独的临时目录,它收集有关提交的信息。例如临时目录名称是objects/incoming-GsAsa.

pre-receive但是 Git 只在钩子脚本中知道它,因为它正确设置GIT_OBJECT_DIRECTORYGIT_ALTERNATE_OBJECT_DIRECTORIES环境。

因此,问题的答案是正确设置GIT_OBJECT_DIRECTORYGIT_ALTERNATE_OBJECT_DIRECTORIESvars。


推荐阅读