如何获取在预接收挂钩中提交的所有哈希值?

How to get ALL hashes that are being committed in a pre-receive hook?

我正在为 Git 编写预接​​收挂钩。如果推送多个提交,其中任何一个提交失败,那么整个推送都会失败。这就是我想要的。

我的问题是并非所有提交的所有哈希值都被传入。只有最近的提交哈希值是,例如

2 个提交被推送到一个 repo:

Commit 1 - 4b5w<br>
Commit 2 - 6gh7 -------------> passed in to pre-receive hook, 
                               but I want the previous hash too.

我不能使用为每个引用调用的更新挂钩,因为我不希望任何提交在其中任何一个失败时通过,例如提交 1 通过和提交 2 失败是不可接受的,因为当提交 2 失败时我将不得不以某种方式回滚提交 1。

如何从传递给预接收挂钩的所有提交中获取哈希值?

您可以使用预接收挂钩并仍然列出所有推送的提交。
请参阅 this answer,其中包括:

chomp(my @commits = `git rev-list $old..$new`);
if ($?) {
  warn "git rev-list $old..$new failed\n";
  ++$errors, next;
}

foreach my $sha1 (@commits) {
  // validate some policy
}

正如 torek 所说,这仅适用于 master 分支。

你可以deal with multiple branches:

#!/bin/bash
while read oldrev newrev refname
do
    branch=$(git rev-parse --symbolic --abbrev-ref $refname)
    if [ "master" == "$branch" ]; then
        # Do something
    fi
done
while read old new ref; do 
    [[ $new = *[^0]* ]] && news="$news $new"
done
git rev-list $news --not --all

这将避免像 fastforwards over previously pushed commits 触发未更改内容的浪费重新验证之类的事情。