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

时间:2016-08-17 21:39:36

标签: git hash githooks

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

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

2个提交被推送到回购:

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

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

如何将所有提交的哈希值传递给预接收挂钩?

2 个答案:

答案 0 :(得分:2)

while read old new ref; do 
    [[ $new = *[^0]* ]] && news="$news $new"
done
git rev-list $news --not --all

这将避免像以前推送的提交快速转发,触发浪费的未更改内容的重新验证。

答案 1 :(得分: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