【问题标题】:Why is the output of git diff-tree empty in my post-receive hook?为什么我的 post-receive 挂钩中 git diff-tree 的输出为空?
【发布时间】:2018-12-15 12:10:09
【问题描述】:

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

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

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

我肯定更喜欢一种精益方法,例如自动触发构建并推送一个必须 e 的构建。 G。定期检查更改。

【问题讨论】:

  • 具体来说,HEAD 会识别什么提交后接收挂钩何时运行?是合并提交吗?如果是这样,您希望git diff-tree 对此做什么?您应该首先使用HEAD 吗?如果推送到分支 feature/X 但服务器上的 HEAD 引用 master 怎么办?
  • 我只有一个 master 分支,没有被合并。我希望它能够向我显示在刚刚推送的最新提交中更改的文件。
  • 好的,如果不是合并提交,gt diff-tree 实际上应该以更简单的方式将HEAD^HEAD 进行比较。但是您可能希望将特定 ref 名称的当前值与其之前的值进行比较,而不是将 HEAD 的当前值与 HEAD 的父级的当前值进行比较。见brian m. carlson's answer
  • 请注意,顺便说一下,您可以在没有任何其他 分支名称的情况下进行 合并提交。事实上,如果你使用git pull 和其他人一起使用git pushgit pull,那么你可能正在做一些所谓的foxtrot merges

标签: bash git git-post-receive


【解决方案1】:

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

【讨论】:

  • 这将是正确的答案(所以我赞成),但请注意git diff-tree HEAD 会将HEAD 与其父或父进行比较,而不是HEAD 与@ 987654327@。我的猜测显然是错误的,HEAD 可能确定了一个合并提交,在这种情况下,单提交参数差异树默认什么都不做(就像 git log --raw 的差异部分的行为)。
【解决方案2】:

好的,我想通了:我得到了一个

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 含糊不清。

【讨论】:

    猜你喜欢
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 2012-02-17
    • 2012-05-13
    • 2022-12-04
    • 2014-05-13
    相关资源
    最近更新 更多