Vários comandos não estão funcionando no Git após a recepção
-
27-09-2019 - |
Pergunta
Estou usando o Git com Trac. Depois do push, quero que duas coisas sejam feitas:
- Enviando email para a equipe de desenvolvimento com diff
- Se houver alguma frase especial na mensagem de confirmação (como "Veja #1"), quero que a mensagem de confirmação seja colocada no ticket trac.
A primeira coisa é resolvida por Git-Commmit-Notifier. Funciona perfeitamente depois que eu criei o gancho pós-recepção:
#!/bin/sh /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml
Meu segundo requisito pode ser resolvido como descrito em http://trac-hacks.org/wiki/gitplugin#post-receivehookscripts. Também funciona perfeitamente com esse gancho pós-recebimento:
#!/bin/sh /var/trac/testgit/commit-updater
Ambas as duas coisas funcionam quando são separadas. Mas eu preciso combiná -los. Então, eu criei o gancho pós-recebimento:
#!/bin/sh /var/trac/testgit/commit-updater /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml
É muito engraçado, mas isso não está funcionando. Os comandos correm perfeitamente bem quando a corrida separadamente, mas apenas o primeiro funciona quando são colocados em gancho pós-recepção.
Se eu tenho esse gancho:
#!/bin/sh /var/trac/testgit/commit-updater /var/lib/gems/1.8/bin/git-commit-notifier /etc/git-commit-notifier.yml
Eu recebo o seguinte erro
/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
Mas se eu mudar para a ordem desses 2 comandos, não recebo erros, mas apenas o primeiro comando funciona.
Agradeço qualquer ajuda. Estou tentando resolver esse problema por um longo tempo e não tenho idéias.
Solução
Assumindo que meu comentário está correto e commit-updater
está comendo tudo stdin
, isso deve fazer o truque:
#!/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
Outras dicas
Achei a solução de Ngoozeff útil, mas tive que fazer algumas adições. No começo, o script deve falhar se um dos gancho falhar. Em segundo, alguns ganchos podem esperar argumentos. No meu caso, o gancho Gitzilla era assim.
Para mim, o seguinte funcionou para combinar ganchos Gitzilla e 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
Observe o $* e as instruções de saída. Você também pode usar a variável $ git_dir. Os arquivos Update.Gitzilla e Update.Gitolite são links simbólicos.
Uma alternativa ao uso de um arquivo seria:
#!/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
Fonte: http://mmm.beachtemple.com/blog/2009/04/06/git-post-receive-ook/
Como os dados de entrada não são tão enormes, você pode ficar sem arquivo temporário e manter os dados no shell:
#!/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