Несколько команд не работают в git post-receive

Я использую git с trac. После нажатия я хочу сделать две вещи:

  • Отправка электронной почты разработчику с помощью diff
  • Если в сообщении фиксации есть специальная фраза (например, "см. № 1" ), я хочу, чтобы сообщение фиксации было помещено в билет trac.

Первое, что решается с помощью git -commit-notifier. Он отлично работает после того, как я создал post-receive hook:

#!/bin/sh
/var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml

Мое второе требование можно решить, как описано в http://trac-hacks.org/wiki/GitPlugin#post-receivehookscripts. Он также отлично работает с таким крюком после приема:

#!/bin/sh
/var/trac/testgit/commit-updater

Обе вещи работают, когда они раздельны. Но мне нужно их комбинировать. Итак, я создал post-receive hook:

#!/bin/sh
/var/trac/testgit/commit-updater
/var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml

Это очень забавно, но это не работает. Команды работают отлично, когда запуск выполняется отдельно, но только первый работает, когда они помещаются в крюк после приема.

Если у меня такой крючок:

#!/bin/sh
/var/trac/testgit/commit-updater
/var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml

Я получаю следующую ошибку

/var/lib/gems/1.8/gems/git-commit-notifier-0.8.0/bin/git-commit-notifier:12: undefined method `strip' for nil:NilClass (NoMethodError)
 from /var/lib/gems/1.8/bin/git-commit-notifier:19:in `load'
 from /var/lib/gems/1.8/bin/git-commit-notifier:19

Но если я перехожу к порядку этих двух команд, я не получаю никаких ошибок, но работает только первая команда.

Буду признателен за любую помощь. Я пытаюсь решить эту проблему в течение длительного времени, и у меня нет идей.

4 ответа

Предполагая, что мой комментарий верен, и commit-updater ест все stdin, это должно сделать трюк:

#!/bin/sh
FILE=`mktemp`
cat - > $FILE
cat $FILE | /var/trac/testgit/commit-updater
cat $FILE | /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml
rm $FILE


Альтернативой использованию файла будет:

#!/bin/sh
while read oldrev newrev refname
do
 echo $oldrev $newrev $refname | /var/trac/testgit/commit-updater
 echo $oldrev $newrev $refname | /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml
done

Источник: http://mmm.beachtemple.com/blog/2009/04/06/git-post-receive-hook/


Я нашел решение ngoozeff полезным, но мне пришлось сделать несколько дополнений. Во-первых, script должен завершиться неудачно, если один из крючков не сработает. Во-вторых, некоторые крючки могут ожидать аргументы. В моем случае крюк гициллы был таким.

Для меня следующие работали для объединения гитцилльских и гитолитовых крючков:

#!/bin/sh
FILE=`mktemp`
cat - > $FILE
cat $FILE | $GIT_DIR/hooks/update.gitzilla $* || exit 1 
cat $FILE | $GIT_DIR/hooks/update.gitolite $* || exit 1
rm $FILE

Обратите внимание на операторы $* и exit. Вы также можете использовать переменную $GIT_DIR. Файлы update.gitzilla и update.gitolite являются символическими ссылками.


Поскольку входные данные не так велики, вы можете обойтись без временного файла и сохранить данные в оболочке:

#!/bin/sh
refs=$(cat)
/var/trac/testgit/commit-updater <

licensed under cc by-sa 3.0 with attribution.