Ich versuche, einen Git-Hook einzurichten, der es jedem verwehrt, die master
, alpha
y beta
Zweige unseres Repositorys. Kann mir jemand dabei helfen? Ich habe noch nie einen Git-Hook gemacht, also möchte ich mein Glück bei der Entwicklung meines eigenen nicht ohne ein wenig Hilfe versuchen.
Antworten
Zu viele Anzeigen?Unkompliziert mit einer pre-receive
Haken. Angenommen, Sie verwenden ein einfaches zentrales Repository, dann platzieren Sie den folgenden Code in your-repo.git/hooks/pre-receive
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;
Wenn Sie damit zufrieden sind, alle Löschungen von Zweigen über 'push' zu verweigern, können Sie einfach die Konfigurationsvariable receive.denyDeletes
a true
auf Ihr Repository.
Wenn Sie eine ausgefeiltere Kontrolle benötigen, empfehle ich Ihnen, einen Blick auf die update-paranoid
Hook aus der Git-Distribution von contrib/hooks
Ordner. Es erlaubt Ihnen, pro Ref Acls einzurichten, die Dinge wie das Verweigern von Nicht-Fast-Forwards und das Verweigern von Löschungen via Push sowie einige anspruchsvollere Verhaltensweisen tun können.
update-paranoid
sollte alles tun, was Sie brauchen, ohne dass Sie einen eigenen Hook schreiben müssen.