Я настроил аналогичную среду, используя Документы по черепахе и могу сказать: Да, это так! Операция включает в себя зацепку Start-Commit, которая заполняет строки, которые пользовательдолжен прочитать и Pre-Commit Hook, который снова удаляет строки:
Start-Commit Hook
Этот хук получает три параметра: PATH MESSAGEFILE CWD
.MESSAGEFILE
- это путь к временному файлу, который будет использоваться для хранения сообщения о коммите.Вы можете заполнить этот временный файл своим сообщением Не забудьте сделать X! Или вы добавляете к сообщению префикс, который вы будете рассматривать как комментарий в сообщении фиксации и отфильтровывать.Поскольку Git использует #
в качестве комментария в сообщении фиксации, я сделал то же самое: каждая строка, начинающаяся с #
, отфильтровывается из сообщения фиксации.И поэтому я бы написал сообщение # Don't forget to do X!
.Пример реализации в Perl (не проверено):
use strict; # what we always have
use warnings; # what we always have
use Fcntl ':flock'; # lock files when writing
use Carp; # use croak instead of die
use English qw( -no_match_vars ); # words instad of cryptic variables
sub startcommit_hook{
# open the logfile
my $logfilename = $ARGV[1];
# write hint line about supported tags
open my $handle, '>:utf8', $logfilename
or croak "Opening $logfilename for writing failed\n";
flock $handle, LOCK_EX;
print {$handle} "# Don't forget to do X!\n";
flock $handle, LOCK_UN;
return close $handle or croak "unable to close $OS_ERROR";
}
startcommit_hook();
Хук Pre-Commit *
Этот хук получает четыре параметра: PATH DEPTH MESSAGEFILE CWD
.Задача ловушки перед фиксацией состоит в том, чтобы отфильтровать сообщение, которое вы ввели MESSAGEFILE
в ловушке запуска и фиксации (в противном случае оно будет отправлено на сервер как часть сообщения о фиксации, и это, вероятно, не то, чтохочу).Либо просто удалите ваше сообщение Не забудьте сделать X! или - если вы используете подход с комментариями, как я писал выше - удалите каждую строку, которая начинается со знака #
(или соответствует шаблону ^\s*#
) так как это комментарий в нашем мире.
Мы могли бы расширить наш файл для ловушки start-commit, чтобы обрабатывать также вещи перед фиксацией, поскольку число параметров различно.Решение о том, какой хук вызывать, состоит из числа параметров, переданных в скрипт (также не протестированных):
use strict; # what we always have
use warnings; # what we always have
use feature 'switch'; # for given-when construct
use Fcntl ':flock'; # lock files when writing
use Carp; # use croak instead of die
use English qw( -no_match_vars ); # words instad of cryptic variables
sub startcommit_hook{
# open the logfile
my $logfilename = $ARGV[1];
# write hint line about supported tags
open my $handle, '>:utf8', $logfilename
or croak "Opening $logfilename for writing failed\n";
flock $handle, LOCK_EX;
print {$handle} "# Don't forget to do X!\n";
flock $handle, LOCK_UN;
return close $handle or croak "unable to close $OS_ERROR";
}
sub precommit_hook{
my $logfilename = $ARGV[2];
# first, read the logfile
open my $handle,'<:utf8',$logfilename or croak "Error reading file contents of $logfilename: $OS_ERROR\n";
my @content = <$handle>;
close $handle or croak "unable to close: $OS_ERROR";
chomp @content;
# now, write it, ignoring the comment lines
open my $handle, '>:utf8', $logfilename
or croak "Opening $logfilename for writing failed\n";
flock $handle, LOCK_EX;
foreach my $line(@content){
if($line !~ /^\s*#/){ # line has no comment, print it.
print {$handle} $line . "\n";
}
}
flock $handle, LOCK_UN;
close $handle or croak "unable to close $OS_ERROR";
return;
}
given($#ARGV){
when (3){startcommit_hook();}
when (4) {precommit_hook();} # no user supplied -> auto lookup
default {croak "Invalid number of parameters";}
}
Чтобы активировать хуки, откройте настройки TortoiseSVN, перейдите к hook scripts
и добавьтесценарий один раз как хук начала-фиксации и один раз как хук предварительной фиксации.Командная строка для вызова будет perl /path/to/script
.А также проверьте Wait for the script to finish
и Hide script while running
.
Примечание
Если вам требуется дополнительная информация, передаваемая крючкам, вы также можете передать пользовательские параметры при назначении крючков внастройки TortoiseSVN.Если вы назначаете пользовательские параметры, они передаются в ловушку до параметров по умолчанию (как указано в docs ).