2016-08-17 2 views
1

Ich schreibe einen Pre-Empfangshaken für Git. Dies ist der Fall, wenn mehrere Commits gepusht werden und einer von ihnen fehlschlägt, dann schlägt der gesamte Push fehl. Was ich will.Wie erhalten Sie alle Hashes, die in einem Pre-Receive-Hook festgeschrieben werden?

Mein Problem ist, dass nicht alle Hashes von allen Commits übergeben werden. Nur der letzte Commit-Hash ist, z.

2 Commits eines Repo werden geschoben:

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

Ich kann nicht das Update Haken verwendet werden, die für jede ref genannt wird, weil ich, wenn einer zu durchlaufen nicht alle Commits wollen von sie versagt, z commit 1 passing und commit 2 failing ist nicht akzeptabel, da ich Commit 1 irgendwie rückgängig machen müsste, wenn Commit 2 fehlschlägt.

Wie bekomme ich die Hashes von ALLEN Commits, die an den Pre-Receive-Hook übergeben werden?

Antwort

1

Sie können einen Pre-Receive-Hook verwenden und trotzdem alle Push-Commits auflisten.
Siehe this answer welche umfasst:

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 
} 

Wie torek kommentierte, dass dies nur für die master Zweig.

Sie können 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

so offensichtlich ich fühle mich wie mich selbst zu treten, völlig vergessen über die alte Ref, die in passiert ist, danke. – noobcoder

+0

[Jthills Antwort] (http://stackoverflow.com/a/39006852/1256452) ist ein wenig besser, da es mehrere Referenzaktualisierungen behandelt, die Objekte teilen. Das Perl-Skript in der ursprünglichen Antwort sucht nur nach einem Update für die Verzweigung "Master". Natürlich besteht das eigentliche Problem meist darin, genau zu definieren, wann und wie man welche Objekte überhaupt untersuchen soll: Wollen Sie wirklich jedes Objekt bei jedem Push oder nur bestimmte auf bestimmten Zweigen validieren? Was ist mit Notizen? – torek

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

Diese Dinge wie fastforwards über zuvor geschoben Commits vermeiden verschwendet Revalidierung unveränderter Inhalt auszulösen.

+0

Schön, das scheint genauer. +1 – VonC

Verwandte Themen