Comment puis-je supprimer des fichiers indiquant «ancien mode 100755 nouveau mode 100644» des modifications non mises en scène dans Git?

724

Pour une raison quelconque, lorsque j'ai initialement fait une extraction du référentiel pour un de mes projets git, j'ai reçu une tonne de fichiers dans ma copie de travail qui n'ont pas été modifiés, mais continuent de s'afficher dans ma unstaged changesrégion.

J'utilise Git Gui sur Windows XP, et quand je vais regarder le fichier pour voir ce qui a changé. Tout ce que je vois c'est:

old mode 100755  
new mode 100644  

Quelqu'un sait-il ce que cela signifie?

Comment puis-je extraire ces fichiers de ma liste de modifications non planifiées? (Très ennuyeux de devoir parcourir des centaines de fichiers, juste pour sélectionner les fichiers que j'ai récemment modifiés et que je veux valider).

concept47
la source

Réponses:

1287

Cela ressemble à des modes d'autorisations de fichiers Unix pour moi ( 755= rwxr-xr-x, 644= rw-r--r--) - l'ancien mode incluait l'indicateur + x (exécutable), le nouveau mode ne le fait pas.

Les réponses de ce problème msysgit suggèrent de définir core.filemode sur false afin de se débarrasser du problème:

git config core.filemode false
ambre
la source
132
+1. Cela signifie que git pense qu'il peut correctement définir le bit exécutable sur les fichiers extraits, mais quand il essaie de le faire, cela ne fonctionne pas (ou du moins pas d'une manière qu'il puisse lire). Lorsqu'il lit ensuite l'état de ces fichiers, il semble que le bit exécutable ait été délibérément désactivé. Définir core.filemode sur false indique à git d'ignorer toutes les modifications de bits exécutables sur le système de fichiers afin qu'il ne considère pas cela comme une modification. Si vous devez effectuer un changement de bit exécutable, cela signifie que vous devez le faire manuellement git update-index --chmod=(+|-)x <path>.
CB Bailey
7
Si, comme moi, les changements de mode sont importants, vous pouvez définir core.filemode sur false, valider vos modifications de code réelles, puis définir core.filemode sur true et git conservera les modifications du fichier.
Michael T. Smith
8
J'ai le même problème, mais c'était dû à l'utilisation de la même repro git via la ligne SSH git cmd, et via les extensions Git sur un lecteur mappé sous Windows! . . La solution était la même, ajoutée dans "config" [core] filemode = false
Ian Vaughan
2
C'était une bouée de sauvetage, merci monsieur! Cela m'est arrivé sur OSX, après avoir partagé un référentiel cloné sur le dossier public et modifié les autorisations pour les fichiers.
Thiago Ganzarolli
8
@robsch Vous pouvez utiliser git config --global ...pour définir l'option dans votre fichier de configuration global.
Amber
98

La définition core.filemodede false fonctionne, mais assurez-vous que les paramètres de ~/.gitconfigne sont pas remplacés par ceux de .git/config.

NovelX
la source
3
J'y suis allé, j'ai fait ça. Malheureusement, je n'ai trouvé votre commentaire qu'après avoir résolu le problème moi-même. Pourtant, +1!
David Schmitt
1
Si d'autres utilisateurs clonent ce projet sous Windows, il peut être préférable d'appliquer simplement la modification au ~/.gitconfigfichier!
Ian Vaughan
Si vous souhaitez vérifier sur Windows Powershell. git config --list --show-origin | sls filemodeou sous Linux git config --list --show-origin | grep filemode. Cela vous montrera où vous devez effectuer les ajustements.
Frank Fu
Vous avez réussi!! Bien joué.
Kim
27

J'ai rencontré ce problème lors de la copie d'un dépôt git avec des fichiers de travail d'un ancien disque dur à quelques reprises. Le problème provient du fait que le propriétaire et les autorisations sont passés de l'ancien lecteur / machine au nouveau. Le plus long et le plus court, exécutez les commandes suivantes pour redresser les choses ( grâce à cette réponse de superutilisateur ):

sudo chmod -R -x . # remove the executable bit from all files

L'ancienne commande résoudra en fait les différences signalées par git diff, mais révoquera votre capacité à répertorier les répertoires, donc ls ./échoue avec ls: .: Permission denied. Pour résoudre ce problème:

sudo chmod -R +X . # add the executable bit only for directories

La mauvaise nouvelle est que si vous avez des fichiers que vous souhaitez conserver exécutables, tels que des .shscripts, vous devrez les annuler. Vous pouvez le faire avec la commande suivante pour chaque fichier:

chmod +x ./build.sh # where build.sh is the file you want to make executable again
Scott Willeke
la source
2
Merci, ça m'a beaucoup aidé! Il convient également de vérifier qu'il git config core.filemodeest défini sur true, sinon les modifications d'autorisation ne seront pas détectées. J'ai également eu besoin de rafraîchir l'index git après chaque changement pour le récupérer.
pat-s
Cette solution est la plus sûre si vous vous inquiétez des dépendances affectées.
Jin
9

Cela se produit généralement lorsque le dépôt est cloné entre des machines Windows et Linux / Unix.

Dites simplement à git d'ignorer le changement de mode de fichier, voici plusieurs façons:

  1. Config UNIQUEMENT pour le dépôt actuel:

    git config core.filemode false
    
  2. Configuration globale:

    git config --global core.filemode false
    
  3. Ajoutez ~ / .gitconfig:

    [core]
         filemode = false
    

Sélectionnez-en un.

K. Symbole
la source
La configuration globale ne fonctionne pas parce que (je suppose) git crée un référentiel avec cette option définie sur true (j'ai créé un référentiel sous linux)
Herrgott
4

Il semble que vous ayez modifié certaines autorisations du répertoire. J'ai fait les étapes suivantes pour le restaurer.

$  git diff > backup-diff.txt                ### in case you have some other code changes 

$  git checkout .
SuperNova
la source
3

Vous pouvez essayer git reset --hard HEAD pour réinitialiser le référentiel à l'état par défaut attendu.

Doppelganger
la source
8
Si git n'a pas pu définir le bit exécutable correctement / de manière cohérente après un pull, cela ne va pas s'améliorer après une réinitialisation.
CB Bailey
2
J'ai déplacé certains projets vers un lecteur USB (fat32) et de nouveau vers ma machine Ubuntu (ext4) et je me suis retrouvé avec un tas de fichiers modifiés, enfin, les attributs. git reset --hard HEADa parfaitement fonctionné pour moi. merci
cirovladimir
7
-1. OP indique "juste pour sélectionner les fichiers que j'ai récemment modifiés et que je veux valider". Cela supprimerait également ces modifications.
whitfin
9
-1 Suggérer cette commande dans git revient à dire "vous pouvez juste rm -rf ./, je suis sûr que cela n'aura pas de conséquences inattendues".
Kzqai
1
Non, cela n'aide pas et c'est le problème. Vous réinitialisez et nettoyez et le statut de git montre toujours les changements de mode. C'est un sérieux problème avec Windows Git et je pense qu'il devrait être corrigé, pas seulement contourné en ignorant le mode fichier.
vezenkov
1

Cela se produit lorsque vous extrayez et que tous les fichiers étaient exécutables dans le référentiel distant. Les rendre à nouveau exécutables ramènera tout à nouveau à la normale.

chmod +x <yourfile> //For one file
chmod +x folder/* // For files in a folder

Vous devrez peut-être faire:

chmod -x <file> // Removes execute bit

au lieu de cela, pour les fichiers qui n'ont pas été définis comme exécutables et qui ont été modifiés en raison de l'opération ci-dessus. Il existe une meilleure façon de le faire, mais ce n'est qu'une solution très rapide et sale.

IskandarG
la source
1

Vous pouvez utiliser la commande suivante pour modifier à nouveau votre mode de fichier. git add --chmod=+x -- filename Engagez-vous ensuite dans la branche.

Wae
la source
0

Je n'avais qu'un seul fichier gênant avec les autorisations modifiées. Pour le restaurer individuellement, je l'ai simplement supprimé manuellement avecrm <file> , puis effectué un paiement pour extraire une nouvelle copie.

Heureusement, je ne l'avais pas encore mis en scène.

Si j'avais, j'aurais pu courir git reset -- <file>avant de courirgit checkout -- <file>

kEnobus
la source
0

Je viens de rencontrer ce problème lorsque je diffère ma branche avec master. Git a renvoyé une erreur de «mode» lorsque je m'attendais à ce que ma branche soit identique à master. J'ai corrigé en supprimant le fichier, puis en fusionnant à nouveau le maître.

J'ai d'abord lancé le diff:

git checkout my-branch
git diff master

Cela a renvoyé:

diff --git a/bin/script.sh b/bin/script.sh
old mode 100755
new mode 100644

J'ai ensuite exécuté ce qui suit pour corriger:

rm bin/script.sh
git merge -X theirs master

Après cela, git diffn'a retourné aucune différence entre ma branche et le maître.

Collin Krawll
la source