Сбой хука предварительной фиксации Git в GitHub для Mac (работает в командной строке)

Я создал очень простой сценарий предварительной фиксации: -

#!/usr/bin/env sh

# Run tests
npm test
if [ $? -ne 0 ]; then
  echo "Tests failed. Aborting.."
  exit 1
fi

exit 0

Когда я запускаю git commit в командной строке (с проваленными тестами), я получаю ожидаемый выход 1 с сообщением Tests failed. Aborting...

Однако, если я использую GitHub для Mac, я получаю:

.git/hooks/pre-commit: line 5: npm: command not found
Tests failed. Aborting..
 (256)

Я предполагаю, что это связано с тем, что npm недоступна для среды выполнения, которую использует GitHub для Mac, но я рвал на себе волосы, пытаясь понять, как это исправить.


person isNaN1247    schedule 14.10.2012    source источник


Ответы (3)


Решено. Поскольку глобально установленные модули узлов заканчиваются под /usr/local/bin, мне просто нужно было добавить следующее в начале моей предварительной фиксации:

PATH=$PATH:/usr/local/bin:/usr/local/sbin

то есть добавление /usr/local/bin и /usr/local/sbin к PATH в момент выполнения.

person isNaN1247    schedule 14.10.2012
comment
В случае, если кто-то еще беспокоится о нарушении рабочих процессов товарищей по команде, это работает и в Windows, поскольку все git-хуки в Windows запускаются через эмулятор git bash. - person Steven Kalt; 24.05.2018

Переменная $PATH, доступная в средах с графическим интерфейсом, таких как Github Desktop и Sourcetree, отличается от той, которая доступна в терминале. По умолчанию $PATH, доступный в средах с графическим интерфейсом, не может найти модули вашего узла. Как было указано в предыдущем ответе, вы можете убедиться, что /usr/local/bin находится в пути, добавив

PATH=$PATH:/usr/local/bin:/usr/local/sbin

В моем случае это не сработало, потому что я использую Диспетчер версий Node, который хранит разные версии Node и делает легко обновлять и переключать версии Node. Он хранит ваши node_modules для каждой версии Node в отдельном файле. Вот код, который я использовал, чтобы обойти эту проблему:

#!/usr/bin/env bash

PATH="/usr/local/bin:$PATH"

if [ -f $HOME/.nvm/nvm.sh ]
then
  . $HOME/.nvm/nvm.sh
  PATH="$HOME/.nvm/versions/node/$(nvm current)/bin:$PATH"
fi

Это проверяет наличие NVM и, если он существует, загружает его и использует для поиска пути к модулям узла для используемой в настоящее время версии Node. Если вы пытаетесь получить доступ только к модулям узла и вам не нужно ничего особенного, вы можете пропустить добавление папка sbin, например /usr/local/sbin

person RustyToms    schedule 12.04.2017
comment
вы можете убедиться, что /usr/local/bin находится в пути, добавив — добавив где? - person sompylasar; 01.09.2017
comment
@sompylasar в сценарии перед фиксацией, я разместил пример. Я изменил сценарий в вопросе и разместил его в своем ответе. Он изменяет PATH в зависимости от того, доступен ли nvm. - person RustyToms; 01.09.2017

Для меня это было то, что у меня не была установлена ​​​​зависимость, которая вызывалась из предварительной фиксации. В моем случае это был composer, поэтому мне помог brew install composer.

В будущем проверьте, отсутствуют ли какие-либо зависимости, вызываемые в вашем файле предварительной фиксации, открыв your-project-directory/.git/hooks/pre-commit в вашем любимом текстовом редакторе и при необходимости установите отсутствующие зависимости.

person Brianna Lee    schedule 11.06.2019