gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:01:48 24 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

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

#!/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

关于bash - 为什么 git diff-tree 的输出在我的 post-receive hook 中是空的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53792216/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com