Wie entferne ich Dateien mit der Aufschrift "alter Modus 100755 neuer Modus 100644" aus nicht bereitgestellten Änderungen in Git?

723

Aus irgendeinem Grund habe ich beim ersten Abrufen aus dem Repository für ein Git-Projekt von mir eine Menge Dateien in meiner Arbeitskopie erhalten, an denen keine erkennbaren Änderungen vorgenommen wurden, die jedoch weiterhin in meinem unstaged changesBereich angezeigt werden.

Ich verwende Git Gui unter Windows XP und wenn ich in die Datei gehe, um zu sehen, was sich geändert hat. Ich sehe nur:

old mode 100755  
new mode 100644  

Weiß jemand was das bedeutet?

Wie kann ich diese Dateien aus meiner Liste der nicht bereitgestellten Änderungen entfernen? (Sehr ärgerlich, wenn ich Hunderte von Dateien durchgehen muss, nur um Dateien auszuwählen, die ich kürzlich bearbeitet habe und die ich festschreiben möchte).

concept47
quelle

Antworten:

1286

Das sieht für mich nach Unix-Dateiberechtigungsmodi aus ( 755= rwxr-xr-x, 644= rw-r--r--) - der alte Modus enthielt das Flag + x (ausführbare Datei), der neue Modus nicht.

In den Antworten dieses Msysgit-Problems wird vorgeschlagen, core.filemode auf false zu setzen, um das Problem zu beheben:

git config core.filemode false
Bernstein
quelle
132
+1. Dies bedeutet, dass git der Meinung ist, dass es das ausführbare Bit für ausgecheckte Dateien korrekt setzen kann, aber wenn es dies versucht, funktioniert es nicht (oder zumindest nicht auf eine Weise, die es lesen kann). Wenn es dann den Status dieser Dateien zurückliest, sieht es so aus, als ob das ausführbare Bit absichtlich nicht gesetzt wurde. Wenn Sie core.filemode auf false setzen, wird git angewiesen, alle ausführbaren Bitänderungen im Dateisystem zu ignorieren, damit dies nicht als Änderung angezeigt wird. Wenn Sie eine ausführbare Bitänderung durchführen müssen, bedeutet dies, dass Sie dies manuell tun müssen git update-index --chmod=(+|-)x <path>.
CB Bailey
7
Wenn wie ich die Modusänderungen wichtig sind, können Sie core.filemode auf false setzen, Ihre tatsächlichen Codeänderungen festschreiben und dann core.filemode auf true setzen, und git behält die Dateiänderungen bei.
Michael T. Smith
8
Ich habe das gleiche Problem, aber es lag an der Verwendung des gleichen Git-Repro über die SSH-Git-Cmd-Zeile und über Git-Erweiterungen auf einem zugeordneten Laufwerk in Windows! . . Die Lösung war dieselbe, hinzugefügt in "config" [core] filemode = false
Ian Vaughan
2
Das war ein Lebensretter, danke, Sir! Dies ist mir unter OSX passiert, nachdem ich ein geklontes Repository für den öffentlichen Ordner freigegeben und die Berechtigungen für die Dateien geändert habe.
Thiago Ganzarolli
8
@robsch Mit git config --global ...dieser Option können Sie die Option in Ihrer globalen Konfigurationsdatei festlegen.
Amber
98

Die Einstellung core.filemodeauf false funktioniert, aber stellen Sie sicher, dass die Einstellungen in ~/.gitconfignicht von denen in überschrieben werden .git/config.

NovelX
quelle
3
Kenne ich schon. Leider habe ich Ihren Kommentar erst gefunden, nachdem ich das Problem selbst gelöst habe. Trotzdem +1!
David Schmitt
1
Wenn andere Benutzer dieses Projekt unter Windows klonen, ist es möglicherweise am besten, die Änderung einfach auf die ~/.gitconfigDatei anzuwenden !
Ian Vaughan
Wenn Sie Windows Powershell überprüfen möchten. git config --list --show-origin | sls filemodeoder unter Linux git config --list --show-origin | grep filemode. Dies zeigt Ihnen, wo Sie die Anpassungen vornehmen müssen.
Frank Fu
Du hast den Nagel auf den Kopf getroffen!! Gut gemacht.
Kim
27

Ich bin auf dieses Problem gestoßen, als ich ein paar Mal ein Git-Repo mit Arbeitsdateien von einer alten Festplatte kopiert habe. Das Problem ergibt sich aus der Tatsache, dass der Eigentümer und die Berechtigungen vom alten Laufwerk / Computer zum neuen geändert wurden. Das lange und kurze daran ist, die folgenden Befehle auszuführen, um die Dinge zu korrigieren ( dank dieser Superuser-Antwort ):

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

Der erstere Befehl löst tatsächlich die von git diff gemeldeten Unterschiede auf, widerruft jedoch Ihre Fähigkeit, die Verzeichnisse aufzulisten, und ls ./schlägt daher fehl ls: .: Permission denied. Um das zu beheben:

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

Die schlechte Nachricht ist, dass Sie Dateien zurücksetzen müssen, die ausführbar bleiben sollen, z. B. .shSkripte. Sie können dies mit dem folgenden Befehl für jede Datei tun:

chmod +x ./build.sh # where build.sh is the file you want to make executable again
Scott Willeke
quelle
2
Danke, hat mir sehr geholfen! Man sollte auch überprüfen, ob eingestellt git config core.filemodeist true, sonst werden Berechtigungsänderungen nicht erkannt. Ich musste auch den Git-Index nach jeder Änderung aktualisieren, um ihn aufzunehmen.
Pat-s
Diese Lösung ist am sichersten, wenn Sie sich Sorgen über betroffene Abhängigkeiten machen.
Jin
9

Tritt normalerweise auf, wenn das Repo zwischen Windows- und Linux / Unix-Computern geklont wird.

Sagen Sie git einfach, dass es die Änderung des Dateimodus ignorieren soll. Es gibt verschiedene Möglichkeiten:

  1. NUR für aktuelles Repo konfigurieren:

    git config core.filemode false
    
  2. Global konfigurieren:

    git config --global core.filemode false
    
  3. Fügen Sie in ~ / .gitconfig hinzu:

    [core]
         filemode = false
    

Wählen Sie einfach eine davon aus.

K. Symbol
quelle
Globale Konfiguration funktioniert nicht, weil (ich denke) Git ein Repo mit diesen Optionen auf true setzt (ich habe ein Repo unter Linux erstellt)
Herrgott
4

Anscheinend haben Sie einige Berechtigungen des Verzeichnisses geändert. Ich habe die folgenden Schritte ausgeführt, um es wiederherzustellen.

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

$  git checkout .
SuperNova
quelle
3

Sie können versuchen, git reset --hard HEAD, um das Repo auf den erwarteten Standardzustand zurückzusetzen.

Doppelgänger
quelle
8
Wenn git das ausführbare Bit nach einem Pull nicht richtig / konsistent setzen konnte, wird es nach einem Reset nicht besser.
CB Bailey
2
Ich habe einige Projekte auf ein USB-Laufwerk (fat32) und wieder zurück auf meinen Ubuntu-Computer (ext4) verschoben und am Ende eine Reihe geänderter Dateien erhalten, also die Attribute. git reset --hard HEADhat perfekt für mich funktioniert. danke
cirovladimir
7
-1. OP sagt "nur um Dateien auszuwählen, die ich kürzlich bearbeitet habe und die ich festschreiben möchte". Dies würde auch diese Änderungen entfernen.
Whitfin
9
-1 Das Vorschlagen dieses Befehls in git ähnelt dem Sprichwort "Sie können einfach rm -rf ./, ich bin sicher, es wird keine unbeabsichtigten Konsequenzen haben".
Kzqai
1
Nein, das hilft nicht und das ist das Problem. Sie setzen zurück und bereinigen und der Git-Status zeigt immer noch die Modusänderungen an. Dies ist ein ernstes Problem mit Windows Git und ich denke, es sollte behoben werden, nicht nur durch Ignorieren des Dateimodus umgangen werden.
Vezenkov
2

Ich habe das gleiche Problem konfrontiert. Und das rettet mein Leben: https://gist.github.com/jtdp/5443498

git diff -p -R --no-color \
| grep -E "^(diff|(old|new) mode)" --color=never  \
| git apply`
bkm
quelle
1

Dies geschieht, wenn Sie ziehen und alle Dateien im Remote-Repository ausführbar waren. Wenn Sie sie wieder ausführbar machen, wird alles wieder normal.

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

Möglicherweise müssen Sie Folgendes tun:

chmod -x <file> // Removes execute bit

stattdessen für Dateien, die nicht als ausführbare Datei festgelegt wurden und die aufgrund des obigen Vorgangs geändert wurden. Es gibt einen besseren Weg, dies zu tun, aber dies ist nur eine sehr schnelle und schmutzige Lösung.

IskandarG
quelle
1

Mit dem folgenden Befehl können Sie den Dateimodus wieder ändern. git add --chmod=+x -- filename Dann verpflichten Sie sich zur Niederlassung.

Wae
quelle
0

Ich hatte nur die eine problematische Datei mit den geänderten Berechtigungen. Um es einzeln zurückzusetzen, habe ich es einfach manuell mit gelöscht rm <file>und dann eine Kaufabwicklung durchgeführt, um eine neue Kopie abzurufen.

Zum Glück hatte ich es noch nicht inszeniert.

Wenn ich es getan hätte, hätte ich git reset -- <file>vor dem Laufen laufen könnengit checkout -- <file>

kEnobus
quelle
0

Ich bin gerade auf dieses Problem gestoßen, als ich meinen Zweig mit dem Master unterschied. Git gab einen 'Modus'-Fehler zurück, als ich erwartete, dass mein Zweig mit dem Master identisch ist. Ich habe das Problem behoben, indem ich die Datei gelöscht und dann den Master wieder zusammengeführt habe.

Zuerst habe ich den Diff ausgeführt:

git checkout my-branch
git diff master

Dies gab zurück:

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

Ich habe dann Folgendes ausgeführt, um das Problem zu beheben:

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

Danach wurden git diffkeine Unterschiede zwischen my-branch und master zurückgegeben.

Collin Krawll
quelle