Git - ignorer les changements de mode de fichier (chmod)

3 minutes
git astuce console bash terminal shell logs diff

Comment ignorer les changements de droits sur les fichiers ou dossiers avec Git ?
Comment visualiser les fichiers réellement modifiés ?
Comment annuler le changement de mode via Git ?

Vous avez changé les droits des fichiers ou d'un dossier avec la commande chmod. Lorsque vous faites votre git status vous voyez apparaître une liste de fichiers dont le mode a changé. Mais ce n'est pas utile de les commiter. Alors comment faire ?

Pourquoi changer les droits ?

C'est la première question à se poser !
Les droits du dépôts doivent être les droits du projet.
C'est pour celà que Git prend en compte les permissions par défaut.

Certains dossiers ont besoin de permissions particulières (les logs, le cache, uploads, ...) mais normalement il n'est pas nécessaire des les versionner.
Si vous avez un dossier qui a besoin d'un droit spécial et que ce n'est vraiment pas judicieux de le commiter, le script de déploiement effectuera l'attribution des droits nécessaires.
Mais c'est un cas très particulier.

Si vous ne rentrez pas dans ce cas particulier, c'est qu'il y a des problèmes d'accès à certains fichiers ou dossiers.
Donc, il peut être utile de les commiter après le chmod.

Au niveau du projet

Il est possible de désactiver la prise en compte des permissions pour le projet.
Placez vous à la racine de votre projet au préalable.

$ git config core.fileMode false

Cette commande va modifier la configuration git au niveau du projet.
C'est à dire directement dans le fichier de configuration : .git/config.

Vos prochains changement de droits, ne serons plus pris en compte pour ce projet.

Au niveau global

Cette commande est à éviter.

C'est la même commande que précédemment mais avec l'option --global.

$ git config --global core.fileMode false

Elle permet de désactiver l'option fileMode au niveau global (dans le fichier ~/.gitconfig).
La configuration globale est prioritaire sur la configuration du projet.
Donc ce sera appliqué à tous vos projets.
Et c'est pour ça que c'est à éviter 😉.

Au niveau d'une commande

Il est également possible d'ignorer le changement de mode uniquement sur une commande Git.
Par exemple sur un git status, ou un git diff.

$ git -c core.fileMode=false diff

Vous aurez alors les toutes les différences des fichiers sans ceux qui ont eux leur permission qui a changé.

Annuler le changement de mode

Il existe une commande pour faire ça, mais elle est un peu complexe :

$ git diff -p -R --no-color \
    | grep -E "^(diff|(old|new) mode)" --color=never  \
    | git apply

Pour rappel, la commande git diff prend deux entrées et affiche la différence entre les deux. Si rien n'est renseigné, les deux entrées vont être la copie de travail et la branche courante.
Pour le reste, voici le détail des paramètres, commandes utilisées :

  • -p génère un patch
  • -R inverse la différence entre les deux entrées du diff (ça évite de devoir parser le résultat)
  • --no-color désactive la colorisation
  • grep -E permet de filtrer uniquement les lignes qui nous intéressent avec une regexp
  • git apply applique le patch généré

En gros, la commande regarde les permissions qui ont changées et applique les anciennes permissions.

Pour aller plus vite, il est possible de créer un alias global :

$ git config --global --add alias.permission-reset '!git diff -p -R --no-color | grep -E "^(diff|(old|new) mode)" --color=never | git apply'
Blog Comments powered by Disqus.

Article précédent Article suivant