Ключ из документации git заключается в том, что хук post-receive не получает аргументов:
Этот хук выполняется один раз для операции приема. Он не принимает аргументов, но получает ту же информацию, что и ловушка <> для стандартного ввода.
Вот некоторый Perl-код, который я использовал для разбора ref:
while (<>) {
chomp;
next unless my($old,$new,$ref) =
m/ ^ ([0-9a-f]+) \s+ # old SHA-1
([0-9a-f]+) \s+ # new SHA-1
refs\/heads\/(.*?) # ref
\s* $ /x;
#...
}