为什么 git diff-tree 的输出在我的 post-receive hook 中是空的?

Why is the output of git diff-tree empty in my post-receive hook?

我有一个带有源文件的裸远程存储库,我只想在推送到其中后构建更改的文件。我认为检测哪些文件已被更改的最佳方法是将命令 changed_files=$(git diff-tree --no-commit-id --name-only -r HEAD) 进入 post-接收挂钩。

但是,正如我通过将其回显到文件中所验证的那样,该变量最终为空。如果我用 HEAD^ 而不是 HEAD,它确实会显示第二次到最近一次提交的更改文件。但是,当我输入 HEAD 时,它并没有显示最近的更改,而是什么也没显示。

谁能帮帮我?还是有更聪明的方法来解决我的问题?

我肯定更喜欢一种精益方法,比如自动触发一个构建,而推过一个必须 e. G。定期检查更改。

在执行 post-receive 挂钩时,所有引用都已更新。因此,HEAD 表示新头,而不是旧头。 这可能不会产生您想要的结果,因为它假设有一个非合并提交并且您想要与其父项进行差异,而您可能已经推送了一个合并或多个提交。

您可能想要做的是利用提供旧值和新值的标准输入。当您推送时,如下所示的内容会将更改的文件打印为远程端的输出:

#!/bin/sh

while read old new ref
do
    # Handle created or deleted branches.
    echo $old | grep -qsE '^0+$' && old=$(git hash-object -t tree /dev/null)
    echo $new | grep -qsE '^0+$' && new=$(git hash-object -t tree /dev/null)
    git diff-tree --no-commit-id --name-only -r "$old" "$new"
done

好的,我明白了:我得到了一个

remote: fatal: ambiguous argument 'HEAD': both revision and filename

我没有注意到的推送命令错误。更改后

changed_files=$(git diff-tree --no-commit-id --name-only -r HEAD)

changed_files=$(git diff-tree --no-commit-id --name-only -r HEAD --)

一切正常。显然,这是由于在远程存储库的 .git 目录中执行的钩子引起的,并且该目录中有一个名为 HEAD 的文件,这使得将 HEAD 修订版引用为HEAD模棱两可。