Подтвердить что ты не робот

Настроить предварительную фиксацию hook jshint

Недавно я начал проект на github. Мне удалось настроить автоматическое тестирование после каждой фиксации с помощью Travis. Но теперь я хотел бы настроить крюк pre-commit с jshint. Поэтому, если jshint сообщает об ошибках, коммит должен завершиться ошибкой. Но возможно ли это, и если да, то как это сделать?

4b9b3361

Ответ 1

Но возможно ли это...

Да! Это возможно. Я недавно написал об этом. Обратите внимание, что он не является специфичным для GitHub, просто Git в общем случае - поскольку он является крючком для предварительной фиксации, он запускается до отправки любых данных в GitHub.

Любые соответствующие исполняемые файлы в каталоге /.git/hooks вашего репозитория будут выполняться как перехватчики. Вероятно, по умолчанию будет куча примеров перехватов. Вот простая оболочка script, которую я использую в качестве перехвата JSLint-pre-commit (вы могли бы очень легко ее модифицировать для работы с JSHint):

#!/bin/sh

files=$(git diff --cached --name-only --diff-filter=ACM | grep "\.js$")
if [ "$files" = "" ]; then 
    exit 0 
fi

pass=true

echo "\nValidating JavaScript:\n"

for file in ${files}; do
    result=$(jslint ${file} | grep "${file} is OK")
    if [ "$result" != "" ]; then
        echo "\t\033[32mJSLint Passed: ${file}\033[0m"
    else
        echo "\t\033[31mJSLint Failed: ${file}\033[0m"
        pass=false
    fi
done

echo "\nJavaScript validation complete\n"

if ! $pass; then
    echo "\033[41mCOMMIT FAILED:\033[0m Your commit contains files that should pass JSLint but do not. Please fix the JSLint errors and try again.\n"
    exit 1
else
    echo "\033[42mCOMMIT SUCCEEDED\033[0m\n"
fi

Вы можете просто поместить это в исполняемый файл с именем pre-commit в каталог Git hooks, и он будет запущен перед каждой фиксацией.

Ответ 2

В Node.js < делать проверки перед фиксацией (например, JSHint)

Установите jshint из NPM:

npm install jshint

Затем создайте файл .jshintrc в своем проекте, если у вас его еще нет. например: https://github.com/nelsonic/learn-jshint/blob/master/.jshintrc

Теперь установите pre-commit модуль (и сохраните его как зависимость от разработчика):

npm install pre-commit --save-dev

Далее вам нужно будет определить задачу (script), которая будет запущена для JSHint в package.json

например:

{ "scripts": { "jshint": "jshint -c .jshintrc --exclude-path .gitignore ." } }

тогда вы регистрируете скрипты, которые хотите запустить pre-commit (также в package.json), например:

"pre-commit": [ "jshint", "coverage", "etc" ]

Это позволяет вам иметь не одну проверку в вашем рабочем процессе pre-commit. (У нас есть проверки, чтобы код членов команды соответствовал JSHint, Code Style и Test Coverage - 100%)

Для более подробного руководства вы можете поделиться со своей командой: https://github.com/nelsonic/learn-pre-commit

Ответ 3

Некоторые изменения в @James Allardice script для размещения JSHint. Спасибо за исходный код.

#!/bin/sh
#
# Run JSHint validation before commit.

files=$(git diff --cached --name-only --diff-filter=ACMR -- *.js **/*.js)
pass=true


if [ "$files" != "" ]; then
    for file in ${files}; do
        result=$(jshint ${file})

        if [ "$result" != "" ]; then
            echo "$result"
            echo "\n"
            pass=false
        fi
    done
fi


if $pass; then
    exit 0
else
    echo ""
    echo "COMMIT FAILED:"
    echo "Some JavaScript files are invalid. Please fix errors and try committing again."
    exit 1
fi

Ответ 4

Аналогичный script для @igor с некоторыми улучшениями:

  • индикаторы цвета
  • no --diff-filter, grep used insead
  • справочное сообщение (стиль git), чтобы избежать вызова предварительной фиксации

#!/bin/sh
#
# Run JSHint validation before commit.

RED='\033[0;31m'
REDBOLD='\033[1;31m'
ORANGE='\033[0;33m'
NC='\033[0m' # No Color

files=$(git diff --cached --name-only | grep .js)
pass=true
totalErrors=0

if [ "$files" != "" ]; then
    for file in ${files}; do
        result=$(jshint ${file})
        if [ "$result" != "" ]; then
            echo "${RED}$result${NC}"
            pass=false
            totalErrors=$((totalErrors+1))
        fi
        echo ""
    done
fi

if $pass; then
    exit 0
else
    echo "${ORANGE}===== ${totalErrors} JSHint Error${NC}"
    echo ""
    echo "${REDBOLD}COMMIT FAILED: Some JavaScript files are invalid. Please fix errors and try committing again.${NC}"
    echo ""
    echo "  (use -n option \"git commit -n -m <message>\" to avoid call pre-commit hook and JSHint check)"
    echo ""
    exit 1
fi