git github jshint pre-commit-hook

git - setup pre-commit hook jshint



github pre-commit-hook (4)

Pero es esto posible ...

¡Sí! Esto es posible. Recientemente escribí sobre eso . Tenga en cuenta que no es específico de GitHub, solo Git en general, ya que es un enlace de precompromiso, se ejecuta antes de que se envíe cualquier información a GitHub.

Cualquier archivo ejecutable apropiadamente nombrado en el directorio /.git/hooks de su repositorio se ejecutará como ganchos. Es probable que haya muchos ganchos de ejemplo allí de forma predeterminada. Aquí hay un script de shell simple que utilizo como enlace de precomisión de JSLint (en su lugar, podría modificarlo muy fácilmente para trabajar con 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

Simplemente puede poner eso en un archivo ejecutable llamado pre-commit en su directorio de hooks Git, y se ejecutará antes de cada commit.

Recientemente comencé un proyecto en github . Pude configurar las pruebas automáticas después de cada commit usando Travis. Pero ahora me gustaría configurar un enganche precompromiso con jshint también. Entonces, si jshint informa errores, la confirmación debería fallar. Pero, ¿es esto posible y, si es así, cómo hacerlo?


Algunos cambios al guión de @James Allardice para acomodar JSHint . Gracias por el código original.

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


Hay una forma más fácil de realizar verificaciones previas a la confirmación (por ejemplo, JSHint) en su flujo de trabajo de Node.js:

Instala jshint desde NPM:

npm install jshint

Luego crea un archivo .jshintrc en tu proyecto si aún no tienes uno. por ejemplo: https://github.com/nelsonic/learn-jshint/blob/master/.jshintrc

Ahora instale el módulo pre-commit (y guárdelo como una dependencia dev):

npm install pre-commit --save-dev

A continuación, deberá definir la tarea (script) que se ejecutará para JSHint en su paquete. Json

p.ej:

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

a continuación, registra los scripts que desea que se ejecuten antes de la confirmación (también en package.json), por ejemplo:

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

Esto le permite tener más de una verificación en su flujo de trabajo previo a la confirmación. (Tenemos controles para garantizar que el código de los miembros del equipo cumpla con JSHint, Estilo de código y Cobertura de prueba es 100%)

Para obtener un tutorial más detallado que puede compartir con su equipo, consulte: https://github.com/nelsonic/learn-pre-commit


Un script similar al de @ igor con algunas mejoras:

  • indicadores de color
  • no --diff-filter, grep used insead
  • mensaje de ayuda (estilo git) para evitar la llamada previa a la confirmación

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