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?
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à.
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.
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
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
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é!
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").
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
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.
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
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/'
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
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 {} \;