Git guarda el modo del archivo
Además del contenido, Git registra si un archivo es ejecutable.
git ls-files --stage
100755 e69de29... 0 hola.sh
100644 8baef1b... 0 notas.txt
| Modo | Significa |
|---|---|
100644 |
Archivo normal |
100755 |
Archivo ejecutable |
120000 |
Enlace simbólico |
Git solo distingue ejecutable de no ejecutable. No guarda el resto de permisos (dueño, grupo, 600, 750).
Un cambio de permiso es un cambio
chmod -x hola.sh
git diff
old mode 100755
new mode 100644
Git detecta que cambió el permiso aunque el contenido sea idéntico. Se restaura con chmod +x hola.sh o con git restore hola.sh.
Marcar un archivo como ejecutable
chmod +x script.sh && git add script.sh # en Linux y macOS
git add --chmod=+x script.sh # sin tocar el archivo en disco
git update-index --chmod=+x script.sh # si el archivo ya estaba en staging
Las dos últimas formas sirven en Windows, donde el sistema de archivos no tiene bit de ejecución.
Cambios de modo fantasma en WSL
Los archivos bajo /mnt/c/... viven en el disco de Windows y desde WSL aparecen todos como ejecutables. En un repo ubicado ahí, git status puede mostrar todos los archivos como modificados sin que haya cambiado ningún contenido.
Para que Git ignore el bit de ejecución en ese repo:
git config core.fileMode false
La solución de fondo es trabajar dentro del sistema de archivos de Linux (~/proyectos), donde los permisos son reales. Está explicado en la guía de archivos entre Windows y Linux.