2010-01-07 18 views
8

Tôi đang cố gắng thiết lập một móc git sẽ không cho phép bất kỳ ai xóa các nhánh chính, alpha và beta của kho lưu trữ của chúng tôi. Bất cứ ai có thể giúp đỡ với điều này? Tôi chưa bao giờ làm một cái móc git vì vậy tôi không muốn thử vận ​​may của mình trong việc phát triển của riêng tôi mà không cần một chút giúp đỡ.Xóa Dissallow của nhánh Master trong git

Xin cảm ơn trước.

Trả lời

7

Đơn giản với móc pre-receive. Giả sử bạn đang sử dụng kho lưu trữ trung tâm trống, hãy đặt mã sau vào your-repo.git/hooks/pre-receive và đừng quên 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

Nếu bạn sẵn sàng từ chối tất cả các lần xóa chi nhánh qua 'đẩy' thì bạn chỉ có thể đặt biến cấu hình receive.denyDeletes thành true trên kho lưu trữ của mình.

Nếu bạn cần kiểm soát phức tạp hơn, tôi khuyên bạn nên xem móc update-paranoid từ thư mục contrib/hooks của git distribution. Nó cho phép bạn thiết lập cho mỗi acls ref mà có thể làm những việc như từ chối không nhanh chóng chuyển tiếp và từ chối xóa thông qua đẩy cũng như một số hành vi tinh vi hơn.

update-paranoid nên làm mọi thứ bạn cần mà không cần phải viết móc của riêng bạn.