Nano Hash - криптовалюты, майнинг, программирование

несколько команд не работают в git после получения

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

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

Первое решается 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. Он также отлично работает с таким хуком post-receive:

#!/bin/sh

/var/trac/testgit/commit-updater

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

#!/bin/sh

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

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

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

#!/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-х команд, я не получаю никаких ошибок, а работает только первая команда.

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


  • @bessarabov: похоже, что он пытается читать из STDIN, но не может, предположительно, потому что первая строка читает все. 10.08.2010
  • Если ngoozeff прав, пусть ваш хук скопирует стандартный вывод во временный файл, а затем перенаправит этот временный файл в каждую из двух команд. 10.08.2010
  • @ngoozeff спасибо! ваше предложение верно на 100%. =) С помощью @bstpierre теперь все работает! 10.08.2010

Ответы:


1

Предполагая, что мой комментарий верен, и 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
10.08.2010
  • Спасибо! Единственное, что мне пришлось изменить в вашем скрипте, это убрать кавычки: FILE=mktemp И после этого он работает отлично =) 10.08.2010
  • обратные кавычки необходимы, иначе вы получите mktemp в качестве имени файла. 06.04.2011
  • Отлично работает, спасибо. Однако я считаю, что обратные кавычки необходимы, как говорит @cweiske. 13.04.2011

  • 2

    Я нашел решение 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 являются символическими ссылками.

    11.09.2011

    3

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

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

    16.01.2014
  • Это не будет хорошо работать с рассылкой, например. вызов /usr/share/git-core/contrib/hooks/post-receive-email, потому что для каждой строки ввода создается новый процесс, поэтому он может создать столько писем. 14.10.2014

  • 4

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

    #!/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
    
    19.03.2014
    Новые материалы

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

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..