Gancho de pre-commit
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
- yarn
- pnpm
- bun
npm install --save-dev simple-git-hooks pretty-quick
node --eval "fs.writeFileSync('.simple-git-hooks.json',JSON.stringify({'pre-commit':'npx pretty-quick --staged'},undefined,2)+'\n')"
npx simple-git-hooks
yarn add --dev simple-git-hooks pretty-quick
node --eval "fs.writeFileSync('.simple-git-hooks.json',JSON.stringify({'pre-commit':'yarn pretty-quick --staged'},undefined,2)+'\n')"
yarn simple-git-hooks
pnpm add --save-dev simple-git-hooks pretty-quick
node --eval "fs.writeFileSync('.simple-git-hooks.json',JSON.stringify({'pre-commit':'pnpm pretty-quick --staged'},undefined,2)+'\n')"
pnpm simple-git-hooks
bun add --dev simple-git-hooks pretty-quick
node --eval "fs.writeFileSync('.simple-git-hooks.json',JSON.stringify({'pre-commit':'bun pretty-quick --staged'},undefined,2)+'\n')"
bun 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:
-
Los cambios en commits siempre se formatean.
-
Los cambios no preparados nunca se incluyen durante el formateo bajo ninguna circunstancia.
-
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.
-
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:
- npm
- yarn
- pnpm
- bun
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')"
yarn husky init
yarn add --dev git-format-staged
node --eval "fs.writeFileSync('.husky/pre-commit', 'git-format-staged -f \'prettier --ignore-unknown --stdin --stdin-filepath \"{}\"\' .\n')"
pnpm exec husky init
pnpm add --save-dev git-format-staged
node --eval "fs.writeFileSync('.husky/pre-commit', 'git-format-staged -f \'prettier --ignore-unknown --stdin --stdin-filepath \"{}\"\' .\n')"
bunx husky init
bun add --dev git-format-staged
bun --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