为什么 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
模棱两可。
我有一个带有源文件的裸远程存储库,我只想在推送到其中后构建更改的文件。我认为检测哪些文件已被更改的最佳方法是将命令
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
模棱两可。