2700 votes

Comment faire pour que Git ignore les changements de mode de fichier (chmod) ?

J'ai un projet dans lequel je dois changer le mode des fichiers avec chmod à 777 pendant le développement, mais qui ne devrait pas changer dans le repo principal.

Git reprend les chmod -R 777 . et marque tous les fichiers comme modifiés. Existe-t-il un moyen de faire en sorte que Git ignore les changements de mode qui ont été apportés aux fichiers ?

4507voto

Greg Hewgill Points 356191

Essayez :

git config core.fileMode false

Desde git-config(1) :

core.fileMode
    Tells Git if the executable bit of files in the working tree
    is to be honored.

    Some filesystems lose the executable bit when a file that is
    marked as executable is checked out, or checks out a
    non-executable file with executable bit on. git-clone(1)
    or git-init(1) probe the filesystem to see if it handles the 
    executable bit correctly and this variable is automatically
    set as necessary.

    A repository, however, may be on a filesystem that handles
    the filemode correctly, and this variable is set to true when
    created, but later may be made accessible from another
    environment that loses the filemode (e.g. exporting ext4
    via CIFS mount, visiting a Cygwin created repository with Git
    for Windows or Eclipse). In such a case it may be necessary
    to set this variable to false. See git-update-index(1).

    The default is true (when core.filemode is not specified
    in the config file).

El -c peut être utilisé pour définir cette option pour les commandes ponctuelles :

git -c core.fileMode=false diff

Taper le -c core.fileMode=false peut être gênant et vous pouvez donc définir ce drapeau pour tous les dépôts git ou juste pour un seul dépôt git :

# this will set your the flag for your user for all git repos (modifies `$HOME/.gitconfig`)
git config --global core.fileMode false

# this will set the flag for one git repo (modifies `$current_git_repo/.git/config`)
git config core.fileMode false

En outre, git clone y git init explicitement fixé core.fileMode a true dans la configuration du repo comme indiqué dans Git global core.fileMode false surchargé localement sur le clone

Avertissement

core.fileMode n'est pas la meilleure pratique et doit être utilisée avec précaution. Ce paramètre ne couvre que le bit exécutable du mode et jamais les bits de lecture/écriture. Dans de nombreux cas, vous pensez avoir besoin de ce paramètre parce que vous avez fait quelque chose comme chmod -R 777 en rendant tous vos fichiers exécutables. Mais dans la plupart des projets la plupart des fichiers n'ont pas besoin et ne devraient pas être exécutables pour des raisons de sécurité .

La bonne façon de résoudre ce genre de situation est de gérer séparément les droits d'accès aux dossiers et aux fichiers, avec quelque chose du genre :

find . -type d -exec chmod a+rwx {} \; # Make folders traversable and read/write
find . -type f -exec chmod a+rw {} \;  # Make files read/write

Si vous faites cela, vous n'aurez jamais besoin d'utiliser core.fileMode sauf dans de très rares cas.

315voto

yoda Points 1675

Annuler le changement de mode dans l'arbre de travail :

git diff --summary | grep --color 'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -d'\n' chmod +x
git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -d'\n' chmod -x

Ou dans mingw-git

git diff --summary | grep  'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -e'\n' chmod +x
git diff --summary | grep  'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -e'\n' chmod -x

Ou en BSD/macOS

git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7- | tr '\n' '\0' | xargs -0 chmod -x
git diff --summary | grep --color 'mode change 100755 => 100644' | cut -d' ' -f7- | tr '\n' '\0' | xargs -0 chmod -x

152voto

adrien Points 597

Si vous voulez définir cette option pour tous vos dépôts, utilisez la commande --global option.

git config --global core.filemode false

Si cela ne fonctionne pas, vous utilisez probablement une nouvelle version de git. --add option.

git config --add --global core.filemode false

Si vous l'exécutez sans l'option --global et que votre répertoire de travail n'est pas un repo, vous obtiendrez

error: could not lock config file .git/config: No such file or directory

109voto

Sinan Eldem Points 700

Si

git config --global core.filemode false

ne fonctionne pas pour vous, faites-le manuellement :

cd into yourLovelyProject folder

cd dans le dossier .git :

cd .git

modifier le fichier de configuration :

nano config

changer vrai en faux

[core]
        repositoryformatversion = 0
        filemode = true

->

[core]
        repositoryformatversion = 0
        filemode = false

sauvegarder, quitter, aller au dossier supérieur :

cd ..

réinitialiser le git

git init

vous avez terminé !

58voto

Jakub Narębski Points 87537

Ajouter à Réponse de Greg Hewgill (de l'utilisation core.fileMode variable de configuration) :

Vous pouvez utiliser --chmod=(-|+)x option de git update-index (version bas niveau de "git add") pour changer les permissions d'exécution dans l'index, d'où elles seront récupérées si vous utilisez "git commit" (et non "git commit -a").

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X