Saltar al contenido principal

Gancho de pre-commit

Traducción Beta No Oficial

Esta página fue traducida por PageTurner AI (beta). No está respaldada oficialmente por el proyecto. ¿Encontraste un error? Reportar problema →

Puedes usar Prettier con una herramienta de pre-commit. Esto reformatea tus archivos marcados como "staged" mediante git add antes de confirmar cambios.

Opción 1: lint-staged

Caso de uso: Útil cuando necesitas combinar Prettier con otras herramientas de calidad de código (como ESLint, Stylelint) o requieres soporte para archivos parcialmente preparados (git add --patch).

Asegúrate que Prettier esté instalado y figure en tus devDependencies antes de continuar.

npx mrm@2 lint-staged

Esto instalará husky y lint-staged, luego agregará una configuración al package.json del proyecto que formateará automáticamente los archivos admitidos mediante un gancho de pre-commit.

Consulta más detalles en el repositorio de lint-staged.

Opción 2: pretty-quick

Caso de uso: Ideal cuando deseas formatear archivos completos en tus cambios/archivos preparados.

Instálalo junto con simple-git-hooks:

npm install --save-dev simple-git-hooks pretty-quick
echo '{\n "pre-commit": "npx pretty-quick --staged"\n}\n' > .simple-git-hooks.json
npx simple-git-hooks

Consulta más detalles en el repositorio de pretty-quick.

Opción 3: Husky.Net

Caso de uso: Solución dotnet para usar Prettier con otras herramientas de calidad de código (ej. dotnet-format, ESLint, Stylelint). Soporta múltiples estados de archivos (preparados, último commit, git-files, etc.).

dotnet new tool-manifest
dotnet tool install husky
dotnet husky install
dotnet husky add pre-commit

Tras la instalación, puedes agregar la tarea de Prettier al task-runner.json.

{
"command": "npx",
"args": ["prettier", "--ignore-unknown", "--write", "${staged}"],
"pathMode": "absolute"
}

Opción 4: git-format-staged

Caso de uso: Excelente cuando necesitas formatear archivos parcialmente preparados y otras opciones no se adaptan bien a tu proyecto.

Git-format-staged ejecuta cualquier formateador que acepte contenido de archivo vía stdin. Opera distinto a otras herramientas para archivos parcialmente preparados: aplica el formateador directamente a objetos en la base de datos de Git y fusiona cambios al árbol de trabajo. Este procedimiento ofrece garantías:

  1. Los cambios en commits siempre se formatean.

  2. Los cambios no preparados nunca se incluyen durante el formateo bajo ninguna circunstancia.

  3. Si hay conflictos entre cambios formateados/preparados y cambios no preparados, los archivos en tu árbol de trabajo permanecen intactos: tu trabajo no se sobrescribirá y no habrá stashes que limpiar.

  4. Los cambios no preparados no se formatean.

Git-format-staged requiere Python v3 o v2.7. Python suele venir preinstalado en Linux/macOS, pero no en Windows. Usa git-format-staged con husky:

npx husky init
npm install --save-dev git-format-staged
node --eval "fs.writeFileSync('.husky/pre-commit', 'git-format-staged -f \'prettier --ignore-unknown --stdin --stdin-filepath \"{}\"\' .\n')"

Añade o elimina extensiones de archivo según tu proyecto. Nota que el formateo respetará cualquier archivo .prettierignore independientemente de las extensiones listadas.

Para entender cómo funciona git-format-staged, consulta Formateo Automático de Código para Archivos Parcialmente Preparados.

Opción 5: Script de terminal

Alternativamente, puedes guardar este script como .git/hooks/pre-commit y darle permiso de ejecución:

#!/bin/sh
FILES=$(git diff --cached --name-only --diff-filter=ACMR | sed 's| |\\ |g')
[ -z "$FILES" ] && exit 0

# Prettify all selected files
echo "$FILES" | xargs ./node_modules/.bin/prettier --ignore-unknown --write

# Add back the modified/prettified files to staging
echo "$FILES" | xargs git add

exit 0

Si git reporta que tus archivos formateados aún aparecen como modificados después de hacer commit, puede que necesites agregar un script post-commit para actualizar el índice de git.

Agrega algo similar a lo siguiente en .git/hooks/post-commit:

#!/bin/sh
git update-index -g