Der Git-Status zeigt Dateien als geändert an, obwohl der Inhalt identisch ist

191

Ich habe einen Git-Checkout von einer anderen Person erhalten und versuche, die nicht bereitgestellten Änderungen in das lokale Repository zu übernehmen. Allerdings ist eine viel (wenn nicht alle) Datei wird als geändert , obwohl der Inhalt genau das gleiche.

Ich habe bereits core.fileModeauf false gesetzt und auch core.autocrlfauf false gesetzt, ohne Erfolg.

Erwähnenswert ist, dass das Git-Repo, das ich erhalten habe, von jemandem stammt, der Windows verwendet, während ich Linux verwende.

Was kann ich tun, um die tatsächlichen Änderungen zu übernehmen?

EDIT: Ausgabe von git config -l:

user.name=Aron Rotteveel
user.email=<removed>
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=auto
color.ui=true
color.pager=true
color.branch.current=yellow reverse
color.branch.local=yellow
color.branch.remote=green
color.diff.meta=yellow bold
color.diff.frag=magenta bold
color.diff.old=red bold
color.diff.new=green bold
color.status.added=yellow
color.status.changed=green
color.status.untracked=cyan
core.pager=less -FRSX
core.whitespace=fix,-indent-with-non-tab,trailing-space,cr-at-eol
alias.co=checkout
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
core.hidedotfiles=dotGitOnly
core.autocrlf=false
remote.origin.url=<removed>
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/*

Update: Einige zufällige Beispieldateien wurden hinzugefügt. Diese Dateien sind nur Klartext und daher am einfachsten einzuschließen.

Originaldateien befinden sich hier: https://gist.github.com/c3c5302430935155ef3d . Hexdumps zeigen definitiv an, dass die Dateien unterschiedlich sind, aber ich habe keine Ahnung, was dies verursacht und wie es behoben werden kann.

HEAD-Version:

0000000: 4854 4d4c 2e53 6166 654f 626a 6563 740d  HTML.SafeObject.
0000010: 0a54 5950 453a 2062 6f6f 6c0d 0a56 4552  .TYPE: bool..VER
0000020: 5349 4f4e 3a20 332e 312e 310d 0a44 4546  SION: 3.1.1..DEF
0000030: 4155 4c54 3a20 6661 6c73 650d 0a2d 2d44  AULT: false..--D
0000040: 4553 4352 4950 5449 4f4e 2d2d 0d0a 3c70  ESCRIPTION--..<p
0000050: 3e0d 0a20 2020 2057 6865 7468 6572 206f  >..    Whether o
0000060: 7220 6e6f 7420 746f 2070 6572 6d69 7420  r not to permit 
0000070: 6f62 6a65 6374 2074 6167 7320 696e 2064  object tags in d
0000080: 6f63 756d 656e 7473 2c20 7769 7468 2061  ocuments, with a
0000090: 206e 756d 6265 7220 6f66 2065 7874 7261   number of extra
00000a0: 0d0a 2020 2020 7365 6375 7269 7479 2066  ..    security f
00000b0: 6561 7475 7265 7320 6164 6465 6420 746f  eatures added to
00000c0: 2070 7265 7665 6e74 2073 6372 6970 7420   prevent script 
00000d0: 6578 6563 7574 696f 6e2e 2054 6869 7320  execution. This 
00000e0: 6973 2073 696d 696c 6172 2074 6f0d 0a20  is similar to.. 
00000f0: 2020 2077 6861 7420 7765 6273 6974 6573     what websites
0000100: 206c 696b 6520 4d79 5370 6163 6520 646f   like MySpace do
0000110: 2074 6f20 6f62 6a65 6374 2074 6167 732e   to object tags.
0000120: 2020 596f 7520 7368 6f75 6c64 2061 6c73    You should als
0000130: 6f20 656e 6162 6c65 0d0a 2020 2020 254f  o enable..    %O
0000140: 7574 7075 742e 466c 6173 6843 6f6d 7061  utput.FlashCompa
0000150: 7420 696e 206f 7264 6572 2074 6f20 6765  t in order to ge
0000160: 6e65 7261 7465 2049 6e74 6572 6e65 7420  nerate Internet 
0000170: 4578 706c 6f72 6572 0d0a 2020 2020 636f  Explorer..    co
0000180: 6d70 6174 6962 696c 6974 7920 636f 6465  mpatibility code
0000190: 2066 6f72 2079 6f75 7220 6f62 6a65 6374   for your object
00001a0: 2074 6167 732e 0d0a 3c2f 703e 0d0a 2d2d   tags...</p>..--
00001b0: 2320 7669 6d3a 2065 7420 7377 3d34 2073  # vim: et sw=4 s
00001c0: 7473 3d34 0d0a                           ts=4..

Kopierte Version:

0000000: 4854 4d4c 2e53 6166 654f 626a 6563 740a  HTML.SafeObject.
0000010: 5459 5045 3a20 626f 6f6c 0a56 4552 5349  TYPE: bool.VERSI
0000020: 4f4e 3a20 332e 312e 310a 4445 4641 554c  ON: 3.1.1.DEFAUL
0000030: 543a 2066 616c 7365 0a2d 2d44 4553 4352  T: false.--DESCR
0000040: 4950 5449 4f4e 2d2d 0a3c 703e 0a20 2020  IPTION--.<p>.   
0000050: 2057 6865 7468 6572 206f 7220 6e6f 7420   Whether or not 
0000060: 746f 2070 6572 6d69 7420 6f62 6a65 6374  to permit object
0000070: 2074 6167 7320 696e 2064 6f63 756d 656e   tags in documen
0000080: 7473 2c20 7769 7468 2061 206e 756d 6265  ts, with a numbe
0000090: 7220 6f66 2065 7874 7261 0a20 2020 2073  r of extra.    s
00000a0: 6563 7572 6974 7920 6665 6174 7572 6573  ecurity features
00000b0: 2061 6464 6564 2074 6f20 7072 6576 656e   added to preven
00000c0: 7420 7363 7269 7074 2065 7865 6375 7469  t script executi
00000d0: 6f6e 2e20 5468 6973 2069 7320 7369 6d69  on. This is simi
00000e0: 6c61 7220 746f 0a20 2020 2077 6861 7420  lar to.    what 
00000f0: 7765 6273 6974 6573 206c 696b 6520 4d79  websites like My
0000100: 5370 6163 6520 646f 2074 6f20 6f62 6a65  Space do to obje
0000110: 6374 2074 6167 732e 2020 596f 7520 7368  ct tags.  You sh
0000120: 6f75 6c64 2061 6c73 6f20 656e 6162 6c65  ould also enable
0000130: 0a20 2020 2025 4f75 7470 7574 2e46 6c61  .    %Output.Fla
0000140: 7368 436f 6d70 6174 2069 6e20 6f72 6465  shCompat in orde
0000150: 7220 746f 2067 656e 6572 6174 6520 496e  r to generate In
0000160: 7465 726e 6574 2045 7870 6c6f 7265 720a  ternet Explorer.
0000170: 2020 2020 636f 6d70 6174 6962 696c 6974      compatibilit
0000180: 7920 636f 6465 2066 6f72 2079 6f75 7220  y code for your 
0000190: 6f62 6a65 6374 2074 6167 732e 0a3c 2f70  object tags..</p
00001a0: 3e0a 2d2d 2320 7669 6d3a 2065 7420 7377  >.--# vim: et sw
00001b0: 3d34 2073 7473 3d34 0a                   =4 sts=4.
Aron Rotteveel
quelle
1
Wenn Sie core.filemodedeaktiviert oder eingestellt haben, trueunterscheidet sich die Ausgabe?
Mark Longair
Die andere wichtige Information, die helfen würde, ist die Ausgabe vongit --version
Mark Longair
2
@ AaronRotteveel: Das ist einfach: Die erste Datei hat CRLF-Zeilenenden (Fenster), die zweite LF (Unix)
sehe
3
git 2.8 (März 2016) stellt vor git ls-files --eol, um schnell zu sehen, ob eol beteiligt ist. Siehe meine Antwort unten
VonC
Die Person unter Windows kann git config --global core.autocrlf true ausführen , um dieses Problem zu lösen.
Inyoka

Antworten:

62

Update: Gemäß dem Kommentar zu dieser Frage wurde das Problem gelöst:

Das ist einfach: Die erste Datei hat CRLF-Zeilenenden (Fenster), die zweite LF (Unix). Das fileutil (verfügbar in git \ usr \ bin) zeigt Ihnen das ( file a bantwortet so etwas wiea: ASCII text, with CRLF line terminators b: ASCII text )

Ursprüngliche Antwort unten:


Die diff Sie zeigen sich nicht eine einzige andere Linie zeigen. Kannst du .git / config (oder besser) posten?git config -l )

Möglicherweise sind einige Leerzeichen ignoriert

Sie sollten versuchen, zu deaktivieren core.whitespace=fix,-indent-with-non-tab,trailing-space,cr-at-eol ;

ebenfalls

git show HEAD:myfile|md5sum
md5sum myfile

könnte verwendet werden, um zu überprüfen, ob die Dateien tatsächlich unterschiedlich sind. Die Verwendung von externem Diff könnte ebenfalls funktionieren

git show HEAD:myfile > /tmp/myfile.HEAD

diff -u myfile /tmp/myfile.HEAD

# or if you prefer an interactive tool like e.g.:
vim -d myfile /tmp/myfile.HEAD
sehe sehen
quelle
Das Merkwürdige ist , dass die MD5 - Summen für beiden Dateien unterschiedlich sind , aber ich kann nicht finden ANY Leerzeichen Unterschied. (Ich nehme an, dass dies der Fall ist, aber ich sehe es einfach nicht). Jede Hilfe wäre willkommen.
Aron Rotteveel
Laden Sie einfach irgendwo ein Beispiel hoch (gist.github.com wäre dafür geeignet). Ich gehe davon aus, dass es sich um eine neue Zeile in der letzten Zeile, eine Byte-Order-Markierung oder nicht-kanonische UTF8-Codierungen im Allgemeinen handelt. Sie können jederzeit auch binäre Unterschiede betrachten xxdoder bdiffausführen
siehe
Danke für den Tipp. xddwar neu für mich. Tolles Werkzeug! Ich habe meinen Beitrag mit einem Beispiel aktualisiert.
Aron Rotteveel
1
@AronRotteveel: Das ist einfach: Die erste Datei hat CRLF-Zeilenenden (Fenster), die zweite LF (Unix). Bearbeiten Das fileUtil wird Ihnen zeigen, dass ( file a bwird so etwas wie antworten a: ASCII text, with CRLF line terminators b: ASCII text)
sehe
sollten diese in VIM nicht tatsächlich als ^ M angezeigt werden? (Ich sehe es nicht). Natürlich glaube ich dir, aber ich bin wirklich interessiert daran, wie du das tatsächlich bemerkt hast :)
Aron Rotteveel
133

Ich habe dieses Problem mit folgenden Schritten gelöst

1) Entfernen Sie jede Datei aus dem Git-Index.

git rm --cached -r .

2) Schreiben Sie den Git-Index neu, um alle neuen Zeilenenden aufzunehmen.

git reset --hard

Beachten Sie, dass in Schritt 2 möglicherweise Ihre lokalen Änderungen entfernt werden. Die Lösung war Teil der auf der Git-Website https://help.github.com/articles/dealing-with-line-endings/ beschriebenen Schritte.

Jacek Szybisz
quelle
In meinem Fall hatte ich einige Notizen zu einigen Dateien gemacht und dann das Repo ohne den Ordner .git auf einen neuen Computer kopiert. Als ich merkte, dass mir mein .git-Paket fehlte, war es zu spät, zurück zu gehen und es abzurufen. Also habe ich: 1. eine neue Kopie des gesamten Repos ausgecheckt 2. die Vanille-Dateien durch die Dateien mit meinen Änderungen ersetzt 3. Schritt eins im Post des OP ausgeführt: git rm --cached -r .4. Dadurch wurden meine Änderungen (und alle anderen Dateien, die ersetzt wurden) inszeniert ) also habe ich sie nicht inszeniert. Zu diesem Zeitpunkt war mein Repo wieder normal.
Cody
2
Brillant. Danke dafür.
Rupi
6
Seien Sie vorsichtig, da Sie sonst alle Änderungen verlieren.
Mohy Eldeen
Ich hatte dieses Problem, nachdem ich meinen Repo-Ordner von Windows nach Ubuntu kopiert und eingefügt hatte. Es gab keine lokalen Änderungen, aber aus irgendeinem Grund dachte Git, dass sich jede einzelne Datei geändert hat. Diese Lösung löste dieses Problem.
Linek
86

Haben Sie den Modus der Dateien geändert? Ich habe es auf meinem Computer gemacht und der lokale Entwicklungscomputer hatte 777 für alle Dateien, während das Repo 755 hatte, was jede Datei als geändert zeigte. Ich habe git diffes getan und es hat gezeigt, dass der alte und der neue Modus unterschiedlich sind. Wenn das das Problem ist, können Sie sie von git config core.filemode false
Cheers leicht ignorieren

itsandy
quelle
2
Unter Verwendung von Windows 10 lxss (dh Ubuntu Bash) mit einem Repo im Windows-Dateisystem mit Git unter Linux hatte ich gedacht, dass es sich um ein Problem mit dem Zeilenende handelt. Hätte nicht einmal gedacht, dass es auch so sein könnte, wie sich die Dateimodi unterscheiden.
Matt L
Dies funktionierte für mich, als ich mein lokales Betriebssystem von Ubuntu auf Windows änderte. Prost
Mark Bucknell
@MattL und itsandy Ich entwickle normalerweise unter Win 10 mit Git Bash, aber heute bin ich auf Mac und sehe, dass git glaubt, dass sich .gitignoreDateien geändert haben, wenn sie es nicht getan haben. Auf diesem Mac git config core.filemodeantwortet mit true. Ich habe es geändert false, aber das hat nicht geholfen.
Ryan
43

Ich hatte das gleiche Problem. Nach Win-> Lin-Kopie habe ich alle Dateien geändert.
Ich habe fromdos verwendet , um Zeilenenden zu reparieren
und dann

git add -uv 

Änderungen hinzufügen.
Es wurden 3 Dateien hinzugefügt (nicht alle), die ich tatsächlich geändert habe. und danach zeigt der Git-Status nur noch 3 geänderte Dateien an. Nach dem Git-Commit ist alles in Ordnung mit dem Git-Status

Demo_S
quelle
2
Danke, das war was ich brauchte. Ich habe den Vorschlag von @ sehe verwendet, md5sums zu vergleichen, um zu überprüfen, ob die Dateien identisch sind (in meinem Fall). Danach wurden diese Dateien mit dem Flag -u korrekt gefiltert, ohne dass tatsächliche Unterschiede zu denen mit Änderungen bestehen.
STW
Danke, es war hilfreich. Ich hatte dieses Problem, nachdem ich es npm iim Stammverzeichnis meines Projekts ausgeführt hatte. Irgendwie erhielten viele Dateien unterschiedliche Zeilenenden, was zu diesem Problem führte.
Server Khalilov
Dies ist, was ich erwartet hatte ... die Änderungen, die vorgenommen wurden, bleiben und Ruhe wurde rückgängig gemacht
Deepak
24

In meinem Fall wurden die Dateien nach dem Ändern der Dateiberechtigungen als geändert angezeigt .

Gehen Sie wie folgt vor, damit git Berechtigungsänderungen ignoriert:

# For the current repository
git config core.filemode false   

# Globally
git config --global core.filemode false
Sakis
quelle
1
Ihre Antwort hat mir viel Zeit gespart. Vielen Dank!
Pavel_K
Danach empfehle ich, die gewünschten Änderungen zu speichern / bereitzustellen , die Dateien zurückzusetzen / auszuchecken , deren Berechtigungen geändert wurden, und sie dann erneut zu aktivieren core.filemode. :)
XtraSimplicity
Ich hatte dieses Problem, nachdem ich die Dateien von einem Laptop auf einen anderen kopiert hatte. Ihr Fix hat es gespeichert. Vielen Dank!
Sam
23

Viele (wenn nicht jede) Dateien werden jedoch als geändert angezeigt, obwohl der Inhalt genau gleich ist.

Mit git 2.8 (März 2016) können Sie schnell überprüfen, ob diese Änderungen mit der Umwelt zusammenhängen.

Siehe Commit a7630bd (16. Januar 2016) von Torsten Bögershausen ( tboegi) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 05f1539 , 03. Februar 2016)

ls-files: EOL-Diagnose hinzufügen

Wenn Sie in einer plattformübergreifenden Umgebung arbeiten, möchte ein Benutzer möglicherweise überprüfen, ob Textdateien normal im Repository gespeichert sind und ob sie .gitattributesentsprechend eingestellt sind.

Machen Sie es möglich, dass Git die Zeilenenden im Index und im Arbeitsbaum sowie die effektiven Text- / EOL-Attribute anzeigt.

Das Zeilenende (" eolinfo") wird folgendermaßen angezeigt:

"-text"        binary (or with bare CR) file
"none"         text file without any EOL
"lf"           text file with LF
"crlf"         text file with CRLF
"mixed"        text file with mixed line endings.

Das effektive Attribut text / eol ist eines davon:

"", "-text", "text", "text=auto", "text eol=lf", "text eol=crlf"

git ls-files --eol gibt eine Ausgabe wie folgt aus:

i/none   w/none   attr/text=auto      t/t5100/empty
i/-text  w/-text  attr/-text          t/test-binary-2.png
i/lf     w/lf     attr/text eol=lf    t/t5100/rfc2047-info-0007
i/lf     w/crlf   attr/text eol=crlf  doit.bat
i/mixed  w/mixed  attr/               locale/XX.po

um zu zeigen, welche eol-Konvention in den Daten im Index (' i') und im Arbeitsbaum (' w') verwendet wird und welches Attribut für jeden angezeigten Pfad wirksam ist .

VonC
quelle
Dies zeigt zwar das Problem, behebt es jedoch nicht.
Greeso
7

So habe ich das Problem unter Linux behoben, während ich ein Projekt geklont habe, das unter Windows erstellt wurde:

Unter Linux muss die folgende Einstellung vorhanden sein, damit alles ordnungsgemäß funktioniert: core.autocrlf = input

So stellen Sie es ein: git config --global core.autocrlf input

Dann klonen Sie das Projekt erneut von Github.

Wahrheitssucher
quelle
Dies funktionierte für mich in einem Szenario, in dem ich Visual Studio unter Windows verwende, aber Commits und zusätzliche Überprüfungen in der WSL in der Befehlszeile durchführe. In der Befehlszeile wurde jede Datei als geändert angezeigt, in Visual Studio wurden jedoch nur wenige Dateien geändert. Ich habe autoclrf = input in meine .gitconfig-Datei eingefügt und es wurde sofort behoben. Danke dir!
Big Data Brian
5

Die Git-FAQ enthält eine Antwort, die relevant sein könnte, obwohl ich diese noch nie zuvor gesehen habe:

Warum listet git diff manchmal eine Datei auf, die keine Änderungen aufweist?

git diff und andere git-Operationen sind so optimiert, dass nicht einmal Dateien angezeigt werden, deren Status (Größe, Änderungszeit usw.) auf der Festplatte und im git-Index unterschiedlich sind. Dies macht Git Diff extrem schnell für kleine Änderungen. Wenn die Datei irgendwie berührt wurde, muss git diff den Inhalt von betrachten und vergleichen, was eine viel langsamere Operation ist, selbst wenn es tatsächlich keine Änderung gibt. git diff listet die Dateien auf, um daran zu erinnern, dass sie nicht optimal genutzt werden. Wenn Sie den Git-Status ausführen, wird nicht nur der Status angezeigt, sondern auch der Index mit dem Status für unveränderte Dateidisketten aktualisiert, wodurch nachfolgende Vorgänge, nicht nur Unterschiede, viel schneller ausgeführt werden. Ein typischer Fall, bei dem viele Dateien von diff aufgelistet werden, ist das Ausführen von Massenbearbeitungsbefehlen wie perl -pi -e '...'.

Was git statuszeigt sich für Sie?

Mark Longair
quelle
git statuszeigt einfach eine enorme Liste von Dateien im geänderten Bereich.
Aron Rotteveel
@ Aaron: basierend auf diesem Hinweis würde ich sagen: 85% sagt Lineend-Konvertierung
sehe
4
Beeindruckend. Eine Erinnerung daran, wie unverständlich einige der offiziellen Git-Dokumente sind.
Mars
2

Nachdem ich mein lokales Repository und die Arbeitskopie in einen anderen Ordner kopiert hatte (übrigens unter Windows), hatte ich vier Dateien, die immer wieder als geändert angezeigt wurden, und versuchte jeden in den anderen Antworten aufgeführten Vorschlag. Am Ende wurde das Problem behoben, indem der lokale Zweig gelöscht und erneut von der Fernbedienung heruntergeladen wurde. In meinem Fall hatte das wohl etwas mit dem Kopieren eines lokalen Repositorys zu tun, anstatt mit dem Klonen.

Nate Cook
quelle
2

Also habe ich hier so ziemlich alles versucht und möchte eine weitere Lösung beitragen, die alle meine Probleme behebt. Meine Probleme betrafen keine Zeilenenden oder tatsächlichen Berechtigungen oder ähnliches. Das lag daran, dass ich Cygwin und eine ganze Reihe von Dingen installiert hatte, die damit einhergingen, und die ohne mein Wissen auch eine eigene Version von git installiert hatten. Ich habe das nie bemerkt, nur dass ich seltsame Probleme mit Benutzern und Dateien hatte, die als geändert markiert wurden (aufgrund von Änderungen der Dauerwellen).

Es stellt sich heraus, dass ich das herausgefunden habe, weil ich dachte, ich sollte Git einfach auf die neueste Version aktualisieren, was ich getan habe, aber beim Ausführen wurde git --versiondie alte Versionsnummer zurückgegeben. Nach der anschließenden Suche nach dem Warum fand ich das Verzeichnisverzeichnis von cygwin bin in meinem Umgebungspfad, das eine ausführbare Git-Datei enthielt, die unter der alten Versionsnummer ausgeführt wurde. Stelle dir das vor.

Dies war auch schwer zu finden, da ich TortoiseGit installiert habe. Meine Befehlszeilentools verwendeten die Cygwin-Version aufgrund von Pfad-Fallbacks, und TortoiseGit wurde für die Verwendung der Windows-Version konfiguriert, was sie noch verwirrender macht.

Hoffe das hilft jemandem.

Dudewad
quelle
1
Guter Fang. +1. Deshalb habe ich meinen Pfad
VonC
Ich lasse oft einen Installer den PATH einstellen, überprüfe ihn dann aber manuell, was ich hier getan habe. Meine vorherige Installation hatte Git 2.4.x (x86) und ich habe Git 2.13.x (x64) installiert. Sie können sich meine Verwirrung vorstellen, als ich die x86-Pfadreferenz entfernte und immer noch 2.4 bekam !! Dann sah ich das bin-Verzeichnis von cygwin und das schien der nächste logische Ort zu sein. Eine FWIW-Einstellung oder sogar eine visuelle Überprüfung Ihres PFADS kann dies möglicherweise nicht lösen, wenn das Cygwin-Bin-Verzeichnis zuerst aufgeführt wird!
Dudewad
1

Der einzige verdächtige Eintrag in Ihrer Konfiguration scheint mir zu sein core.ignorecase. Sie können versuchen, dies zu deaktivieren mit:

  git config --unset core.ignorecase

... und prüfen, ob die Ausgabe von git statusoder git diffunterschiedlich ist.

Mark Longair
quelle
1

Ich habe gerade filemode = false in .git / config gesetzt und es hat bei mir funktioniert.

filemode = false
Felipe Santa
quelle
0

Für mich lag es daran, dass beide Linux-VMs demselben Heimdateisystem zugeordnet waren. Auf einer VM wurde git-1.7.1 und auf der anderen git-2.14 ausgeführt

Die VM, auf der git-1.7.1 ausgeführt wird, zeigt immer 4 Dateien als geändert an (obwohl der Inhalt und die Zeilenenden identisch waren).

Sobald der Git-Status auf der VM mit g-2.14 ausgeführt wurde, melden beide VMs das Repository als sauber. 'Git Status' hat Nebenwirkungen. Es ist keine unveränderliche Operation. Und git-1.7.1 versteht die Welt nicht so wie git-2 +.

Wilhelm
quelle