2010-01-07 10 views
8

Estoy tratando de configurar un git hook que no permita a nadie eliminar las ramas maestra, alfa y beta de nuestro repositorio. ¿Alguien puede ayudarme con esto? Nunca he hecho un git hook así que no quiero probar suerte en desarrollar el mío sin un poco de ayuda.Eliminar la eliminación de la rama principal en git

Gracias de antemano.

Respuesta

7

Directo con un gancho pre-receive. Suponiendo que está utilizando un repositorio central desnudo, coloque el siguiente código en your-repo.git/hooks/pre-receive, y no se olvide de 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

Si está contento de negar todas las eliminaciones de sucursales mediante 'push', puede simplemente configurar la variable de configuración receive.denyDeletes en true en su repositorio.

Si necesita un control más sofisticado, le recomiendo que eche un vistazo al gancho update-paranoid de la carpeta contrib/hooks de la distribución git. Le permite configurar perlas por ref que pueden hacer cosas como denegar accesos no rápidos y denegar eliminaciones mediante el envío, así como algunos comportamientos más sofisticados.

update-paranoid debe hacer todo lo que necesita sin tener que escribir su propio gancho.

Cuestiones relacionadas