Отмена удаления ветки Master в git - PullRequest
8 голосов
/ 07 января 2010

Я пытаюсь установить git hook, который не позволит никому удалить основную, альфа и бета ветки нашего репозитория. Может кто-нибудь помочь с этим? Я никогда не делал git hook, поэтому я не хочу попытать счастья в разработке своего собственного без небольшой помощи.

Заранее спасибо.

Ответы [ 2 ]

7 голосов
/ 07 января 2010

Прямо с 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 голосов
/ 07 января 2010

Если вы готовы отказать в удалении всех веток с помощью «push», вы можете просто установить переменную конфигурации receive.denyDeletes в true в своем хранилище.

Если вам нужно более сложное управление, ярекомендуем вам взглянуть на хук update-paranoid из папки contrib/hooks дистрибутива git.Он позволяет вам настраивать каждую ссылку, которая может делать такие вещи, как запрет быстрого перемотки вперед и запрет удалений с помощью push, а также некоторые более сложные способы поведения.

update-paranoid должен делать все, что вам нужно, без необходимостинаписать свой собственный хук.

...