Explorador
Concepto

Git y el permiso de ejecución

Cómo guarda Git el bit de ejecución de un archivo, cómo cambiarlo y por qué aparecen cambios de modo fantasma en WSL.

Actualizado el

En esta guía

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.