2010-01-07 9 views
8

Ich versuche, einen Git-Hook einzurichten, der es niemandem erlaubt, die Master-, Alpha- und Beta-Zweige unseres Repositorys zu löschen. Kann mir jemand helfen? Ich habe noch nie einen Githaken gemacht, also möchte ich nicht mein Glück versuchen, ohne etwas Hilfe mein eigenes zu entwickeln.Dissallow Löschen von Master-Zweig in Git

Vielen Dank im Voraus.

Antwort

7

Unkompliziert mit einem pre-receive Haken. Angenommen, Sie verwenden ein reines zentrales Repository, geben Sie den folgenden Code in your-repo.git/hooks/pre-receive ein und vergessen Sie nicht chmod +x your-repo.git/hooks/pre-receive.

#! /usr/bin/perl 

# create: 00000... 51b8d... refs/heads/topic/gbacon 
# delete: 51b8d... 00000... refs/heads/topic/gbacon 
# update: 51b8d... d5e14... refs/heads/topic/gbacon 

my $errors = 0; 

while (<>) { 
    chomp; 

    next 
    unless m[^
       ([0-9a-f]+)  # old SHA-1 
       \s+ 
       ([0-9a-f]+)  # new SHA-1 
       \s+ 
       refs/heads/(\S+) # ref 
       \s* 
       $ 
      ]x; 

    my($old,$new,$ref) = ($1,$2,$3); 

    next unless $ref =~ /^(master|alpha|beta)$/; 

    die "$0: deleting $ref not permitted!\n" 
    if $new =~ /^0+$/; 
} 

exit $errors == 0 ? 0 : 1; 
7

Wenn Sie alle Zweiglöschungen mit 'push' ablehnen möchten, können Sie einfach die Konfigurationsvariable receive.denyDeletes in Ihrem Repository auf true setzen.

Wenn Sie eine komplexere Steuerung benötigen, empfehle ich Ihnen, einen Blick auf den update-paranoid Hook aus dem Ordner contrib/hooks der git-Distribution zu werfen. Es ermöglicht Ihnen die Einrichtung von ref acms, die Dinge tun können, wie zum Beispiel Nicht-Fast-Forwards zu verweigern und Löschungen per Push zu verweigern, sowie einige ausgefeiltere Verhaltensweisen.

update-paranoid sollte alles tun, was Sie brauchen, ohne dass Sie Ihren eigenen Haken schreiben müssen.

Verwandte Themen