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 ?
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
.
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.
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 😉.
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é.
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 colorisationgrep -E
permet de filtrer uniquement les lignes qui nous intéressent avec une regexpgit 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'