overcommit --run reports success when Git cannot read the index

Abierto Apto para principiantes
#909 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
62/100
Tipo de issue
Error
Claridad
Bastante claro
Estado de actividad
Activo
Stack tecnológico
git, ruby
Área
cli, devtools

Línea de trabajo

Empieza en GitRepo.all_files, que ejecuta dos comandos git ls-files con backticks sin comprobar, y compáralo con GitRepo.list_files, que ya verifica el resultado del comando y lanza un error de Overcommit. Verifica ambos resultados de enumeración y termina con un estado distinto de cero cuando Git no pueda leer el índice. Está terminado cuando un índice corrupto produce una salida distinta de cero, mientras que un índice válido vacío, una infracción normal y los archivos rastreados eliminados se comportan como antes. La cuestión del alcance sigue abierta para un mantenedor.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

Reproduced separately on main 50f3e866bef75e3c3be7f92b47b1c45b6e7436ba (0.74.0), macOS 15.6.1, Ruby 4.0.7, Apple Git 2.50.1.

GitRepo.all_files does not check the exit status of either git ls-files command. If Git cannot read the index, both commands fail, but their empty stdout is treated as a valid empty file list. In a scratch repository with a configured TrailingWhitespace hook, the CLI prints Git's fatal errors followed by All pre-commit hooks passed, and exits 0.

Reproduction

  1. In a new disposable repository, configure only TrailingWhitespace with include: ['**/*.rb'] and on_warn: fail, and approve the fixture configuration with overcommit --sign.
  2. Create and stage normal.rb containing a trailing-space violation. Confirm overcommit --run exits 65.
  3. Replace only that disposable repository's .git/index with invalid synthetic bytes. No user repository or live index is needed.
  4. Run overcommit --run again.

Observed stderr:

fatal: .git/index: index file smaller than expected
fatal: .git/index: index file smaller than expected

Observed stdout ends with:

All pre-commit hooks passed

Exit status is 0. A valid empty index also exits 0, so callers cannot distinguish the two states using the process status.

Expected behavior and scope question

When Git cannot enumerate the files to check, --run should report an enumeration error and return a nonzero status rather than success. GitRepo.list_files already checks command success and raises an Overcommit error; all_files currently uses unchecked backticks.

I checked #524: it concerned restoring the working tree/stash after normal pre-commit execution and did not provide a reproducible cause of index corruption. This report neither attributes index corruption to Overcommit nor asks it to repair a broken index. It is specifically about the standalone --run exit status once enumeration fails.

Would a separate change checking both enumeration command results be in scope? The controls would cover a valid empty index, normal violation, deleted tracked files, and Git enumeration failure. I would not combine it with filename parsing, stash handling, or index recovery.

Lenguaje dominante
Ruby
Estrellas
4k
Forks
288
Merge medio
2 d 4 h
PR fusionados (30 d)
18

Preparar el entorno

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de sds/overcommit

Todos los issues de sds/overcommit

Issues similares

Más issues de Ruby

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.