несколько команд не работают в git post-receive - PullRequest
6 голосов
/ 10 августа 2010

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

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

Первым делом решается git-commit-notifier.Он прекрасно работает после того, как я создал хук после получения:

#!/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

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

#!/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

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

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

Ответы [ 4 ]

5 голосов
/ 10 августа 2010

Если мой комментарий верен, а 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
1 голос
/ 16 января 2014

Альтернативой использованию файла может быть:

#!/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/

1 голос
/ 11 сентября 2011

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

Для меня сработало следующее объединение крючков gitzilla и gitolite:

#!/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

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

0 голосов
/ 20 марта 2014

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

#!/bin/sh

refs=$(cat)
/var/trac/testgit/commit-updater <<END
$refs
END
/var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml <<END
$refs
END
...