2010-01-07 72 views
8

我試圖設置一個git鉤子,它將不允許任何人刪除我們倉庫的master,alpha和beta分支。有人能幫忙嗎?我從來沒有做過一個git鉤子,所以我不想在沒有一點幫助的情況下開發自己的運氣。不允許在Git中刪除Master分支

在此先感謝。

回答

7

直接與pre-receive掛鉤。假設您使用的是裸露的中央存儲庫,請在your-repo.git/hooks/pre-receive中放置以下代碼,並且不要忘記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

如果您很高興通過'push'拒絕所有分支刪除,那麼您可以在存儲庫上將config變量receive.denyDeletes設置爲true

如果您確實需要更復雜的控制,我建議您查看git分配的contrib/hooks文件夾中的update-paranoid鉤子。它允許你設置每個參考acls,它可以做一些事情,例如拒絕非快速轉發,並通過推送以及一些更復雜的行爲來拒絕刪除。

update-paranoid應該做你需要的一切,而不必編寫自己的鉤子。