Su iconv puede ser capaz de decir si algo no es UTF-8, pero otras codificaciones puede no ser tan fácil (especialmente 8 bits, codificaciones de un solo byte como ISO-8859-1).
Para Git, en realidad puede querer un enganche de actualización en lugar de un enganche precompromiso (para que pueda ejecutarse en un depósito central para hacer cumplir la regla).
Git gancho pre-commit:
#!/bin/sh
git ls-files -z -- |
xargs -0 sh -c '
e=""
for f; do
if ! git show :"$f" |
iconv -f UTF-8 -t UTF-8 >/dev/null 2>&1; then
e=1
echo "Not UTF-8: $f"
#exit 255 # to abort after first non-UTF-8 file
fi
done
test -z "$e"
' -
poner uno o más pathspecs Git después de la --
en los ls-files git línea de comandos para limitar los nombres de las rutas que estén seleccionadas.
Para comprobar la punta de la ref actualizado en un gancho de actualización, utilice git ls-tree --name-only -r -z $3 -- |
para generar los nombres de ruta (nota: no maneja pathspecs patrón como git ls-files, también lo hacen ningún tipo de filtrado basado en patrones en la cáscara código) y git show "$3:$f"
para extraer el contenido del archivo. También es posible que desee comprobar no solo la confirmación de sugerencia, sino también cada confirmación nueva (bucle para cada confirmación en git rev-list ^$2 $3
en lugar de solo $3
).