web-dev-qa-db-fra.com

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

J'ai un projet dans lequel je dois changer le mode de fichiers avec chmod à 777 en cours de développement, mais qui ne devrait pas changer dans le référentiel principal.

Git récupère le chmod -R 777 . et marque tous les fichiers comme modifiés. Existe-t-il un moyen de faire en sorte que Git ignore les modifications de mode apportées aux fichiers?

2131
Marcus Westin

Essayer:

git config core.fileMode false

De 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).

Le drapeau -c peut être utilisé pour définir cette option pour les commandes uniques:

git -c core.fileMode=false diff

Et le drapeau --global en fera le comportement par défaut de l'utilisateur connecté.

git config --global core.fileMode false

Les modifications du paramètre global ne seront pas appliquées aux référentiels existants. Vous devez à nouveau cloner le référentiel ou exécuter git init. Ceci est sans danger sur les référentiels existants. Cela n'écrasera pas les choses qui sont déjà là.

Attention

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

La bonne façon de résoudre ce genre de situation consiste à gérer les autorisations de dossier et de fichier séparément, avec quelque chose comme:

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 des environnements très rares.

3527
Greg Hewgill

changement de mode d'annulation 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 en 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
264
yoda

Si vous souhaitez définir cette option pour tous vos dépôts, utilisez l'option --global.

git config --global core.filemode false

Si cela ne fonctionne pas, vous utilisez probablement une version plus récente de git. Essayez donc l'option --add.

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 dépôt, vous obtiendrez

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

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

éditez le fichier de configuration:

nano config

changer de vrai à faux

[core]
        repositoryformatversion = 0
        filemode = true

->

[core]
        repositoryformatversion = 0
        filemode = false

enregistrer, quitter, aller au dossier supérieur:

cd ..

réintégrer le git

git init

vous avez terminé!

75
Sinan Eldem

Ajout à réponse de Greg Hewgill (sur l’utilisation de la variable core.fileMode config):

Vous pouvez utiliser l’option --chmod=(-|+)x de git update-index (version de bas niveau de "git add") pour modifier les autorisations d’exécution dans l’index, à partir duquel elles seront récupérées si vous utilisez "git commit" (et non "git commit -a").

51
Jakub Narębski

Vous pouvez le configurer globalement:

git config --global core.filemode false

Si ce qui précède ne fonctionne pas pour vous, la raison peut être que votre configuration locale remplace la configuration globale.

Supprimez votre configuration locale pour que la configuration globale prenne effet:

git config --unset core.filemode

Vous pouvez également modifier votre configuration locale pour obtenir la bonne valeur:

git config core.filemode false

35
Tyler Long

Si vous avez déjà utilisé la commande chmod, vérifiez la différence de fichier. Il indique le mode de fichier précédent et le mode de fichier actuel, tels que:

nouveau mode: 755

ancien mode: 644

définir l'ancien mode de tous les fichiers en utilisant la commande ci-dessous

Sudo chmod 644 .

définissez maintenant core.fileMode sur false dans le fichier de configuration, à l’aide de la commande ou manuellement.

_git config core.fileMode false
_

puis appliquez la commande chmod pour modifier les autorisations de tous les fichiers tels que

_Sudo chmod 755 .
_

et définissez à nouveau core.fileMode sur true.

_git config core.fileMode true
_

Pour les meilleures pratiques, ne gardez pas toujours core.fileMode false.

20
Kishor Vitekar

En définissant l'alias suivant (dans ~/.gitconfig), vous pouvez facilement désactiver temporairement la commande fileMode per git:

[alias]
nfm = "!f(){ git -c core.fileMode=false $@; };f"

Lorsque cet alias est préfixé de la commande git, les modifications de mode de fichier ne seront pas affichées avec des commandes qui les afficheraient autrement. Par exemple:

git nfm status
16
Ville

Si vous voulez définir filemode sur false dans les fichiers de configuration de manière récursive (y compris les sous-modules): find -name config | xargs sed -i -e 's/filemode = true/filemode = false/'

13
dryobs

Solution simple:

Appuyez sur ceci Commande simple dans le dossier du projet (les modifications initiales ne seront pas supprimées) ... il ne restera que supprimer les modifications qui avait été - terminé pendant que vous changiez autorisation du dossier de projet

la commande est ci-dessous:

git config core.fileMode false

Pourquoi tout ce fichier inutile est modifié: parce que vous avez modifié les autorisations du dossier de projet avec commend Sudo chmod -R 777 ./yourProjectFolder

quand allez-vous vérifier les changements que vous n'avez pas fait? vous avez trouvé comme ci-dessous en utilisant git diff filename

old mode 100644
new mode 100755
2
ngCourse

Cela fonctionne pour moi:

find . -type f -exec chmod a-x {} \;

ou inverser, selon votre système d'exploitation

find . -type f -exec chmod a+x {} \;
1
Martin Volek