Cambiar el nombre del file en GIT

Estoy trabajando en un gancho de pre-recepción. Quiero que todos los files sean nombrados en MAYÚSCULAS. Si un file no respeta esta condición, debemos detener el impulso y pedirle al usuario que cambie el nombre del file. Lo intenté

if [[ "$fileName" =~ [az] ]]; then echo -e "file should be in upper Case" >&2 exit 1; fi 

La inserción se detiene después de que un usuario cambia el nombre del file con

 git mv -f tes TES 

y siempre obtengo el error de que el file está en minúscula. ¿Debería eliminar el file de la última confirmación y volver a confirmar con un nuevo nombre?

Parece que el gancho está funcionando. Sin embargo, eso no elimina la confirmación con el nombre de file en minúscula del historial de la reference del repository local.

Si el usuario solo está presionando una única confirmación, entonces pueden corregir los nombres de los files y luego

 git commit --amend 

Más comúnmente, un usuario puede enviar múltiples confirmaciones a la vez. Suponiendo que su gancho comtesting todas las confirmaciones (de lo contrario, los nombres en minúsculas se filtrarán en su historial a lo largo del time), el usuario tendrá que arreglar todo el historial antes de presionar. Esto se puede hacer con git filter-branch . Para limpiar una twig llamada the_branch para que pueda ser empujada:

  • Escriba una secuencia de commands que cambie el nombre de cualquier file en el tree de trabajo a mayúsculas. Puedes llamarlo lo que sea, pero para discusión digamos ucfn.sh
  • Usa la secuencia de commands como un filter de tree

Asi que

 git filter-branch --tree-filter=ucfn.sh -- the_branch 

O tal vez

 git filter-branch --tree-filter=ucfn.sh -- origin/the_branch..the_branch 

(Puede hacer que esta ejecución sea más rápida (si hay muchas confirmaciones nuevas, o si el tree de trabajo es bastante grande) cambiando a un index-filter , pero la secuencia de commands es más difícil de escribir porque no tiene tree de trabajo en un index-filter )

Lo mejor es ayudar a los usuarios a evitar esta condición, proporcionándoles un gancho precompromiso que verifique si el empuje será aceptado y rechace la confirmación de lo contrario. Al igual que cualquier gancho local, tendrían que optar por configurarlo y no puede obligarlos a usarlo, por lo que todavía necesita el gancho posterior a la recepción, pero esto puede evitar que los usuarios se metan en una esquina donde tienen una gran limpieza antes de que puedan empujar.