git diff-tree在后接收挂钩中不起作用

时间:2018-12-15 12:10:10

标签: bash git git-post-receive

我有一个裸露的远程存储库,其中包含源文件,我只想在推送到其中后才生成更改的文件。我认为检测哪个文件已更改的最好方法是通过输入以下命令 changed_files=$(git diff-tree --no-commit-id --name-only -r HEAD)插入接收后挂钩。

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

有人可以帮助我吗?还是有一种更聪明的方法来解决我的问题?

我绝对希望使用精益方法,例如通过自动触发构建来推动构建,而这将不得不执行。 G。定期检查更改。

2 个答案:

答案 0 :(得分:3)

在执行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

答案 1 :(得分:1)

好的,我已经弄清楚了:我得到了

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

我没有注意到的push命令中的

错误。更改后

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不明确。