2016-08-17 8 views
1

私はGitのための事前受信フックを書いています。これは、複数のコミットがプッシュされ、いずれか1つが失敗した場合、プッシュ全体が失敗するものです。それは私が望むものです。どのようにpre-receiveフックでコミットされているすべてのハッシュを取得するには?

私の問題は、すべてのコミットのすべてのハッシュが渡されるわけではないということです。最も最近のコミットハッシュのみが渡されます。

2のコミットは、レポにプッシュされている:

私はのいずれかの場合にはコミットが通過したくないので、私は、各参照のために呼び出されupdateフックを使用することはできません
Commit 1 - 4b5w<br> 
Commit 2 - 6gh7 -------------> passed in to pre-receive hook, 
           but I want the previous hash too. 

それらは失敗する、例えばコミット1とコミット2の失敗は受け入れられません。なぜなら、コミット2が失敗したときに何らかの形でロールバックしなければならないからです。

どのようにして、すべてのコミットからのハッシュをpre-receiveフックに渡すことができますか?

答えて

1

プッシュ受信フックを使用して、プッシュされたすべてのコミットを表示することができます。

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ブランチです:
は、this answerを参照してください。

あなたができる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 
+0

私は自分自身を蹴って、渡された古いrefを完全に忘れてしまったように思います。 – noobcoder

+0

[jthillの回答](http://stackoverflow.com/a/39006852/1256452)は、オブジェクトを共有する複数の参照の更新を処理するので、少し上手です。元の答えのPerlスクリプトは 'master'ブランチの更新だけを見ます。もちろん、本当の問題の大半は、最初の場所でどのオブジェクトを検査するのかをいつ、どのようにして正確に定義するかで構成されています。ノートはどうですか? – torek

2
while read old new ref; do 
    news="$news $new" 
done 
git rev-list $news --not --all 

これは変わらず、コンテンツの無駄な再検証をトリガーする前に、プッシュコミットオーバーfastforwardsのようなものを避けることができます。

+0

ニース、それはもっと正確です。 +1 – VonC

関連する問題