SourceTree App sagt nicht festgeschriebene Änderungen sogar für neu geklonte Repositorys – was könnte falsch sein?

Lesezeit: 10 Minuten

SourceTree App sagt nicht festgeschriebene Anderungen sogar fur neu geklonte
Vill Mattila

Ein Remote-Git-Repository ist nur geklont zu einer lokalen Box mit Atlassian SourceTree. Auch wenn im Worktree keine Dateien wirklich geändert wurden, listet Atlassian gleich eine Reihe von Dateien unter „Uncommitted changes“ auf. Jede Datei zeigt die gleiche Zeilenanzahl sowohl als entfernte als auch als hinzugefügte, und diese Anzahl entspricht der Gesamtanzahl der Zeilen in der Datei. Dies würde irgendwie darauf hindeuten, dass wir auf ein Problem mit dem Zeilenende stoßen.

Allerdings ist das Repository .gitattribute enthält

# Set default behaviour, in case users don't have core.autocrlf set.
* text=auto

das pro GitHub-Artikel Umgang mit Zeilenenden explizit machen sollte core.autocrlf gilt für das Repository. Allerdings auch ~/.gitconfig enthält autocrlf = true.

Wenn versucht wird, die geänderten Dateien auf den vorherigen Commit zurückzusetzen, hat dies keine Auswirkungen. Dieselben Dateien werden immer noch als nicht festgeschrieben angesehen.

Das Repository wurde an mehreren Orten geklont und sichergestellt, dass sich keine Dateien im selben Pfad befinden, um sicherzustellen, dass SourceTree oder Git sich nicht an alte Dateien erinnern.

Das Repository arbeitet mit Windows-, Linux- und OSX-Boxen zusammen. Dieses Problem tritt nur in OSX auf.

Was könnte im SourceTree/Repository/Git-Setup noch falsch sein?


Update Nr. 1, 20. April 2013

Da da noch etwas nicht stimmt, hier Teilausgaben von git config --list.

Von der SourceTree-Konsole (OSX)

core.excludesfile=/Users/User/.gitignore_global
core.autocrlf=input
difftool.sourcetree.cmd=opendiff "$LOCAL" "$REMOTE"
difftool.sourcetree.path=
mergetool.sourcetree.cmd=/Applications/SourceTree.app/Contents/Resources/opendiff-w.sh "$LOCAL" "$REMOTE" -ancestor "$BASE" -merge "$MERGED"
mergetool.sourcetree.trustexitcode=true
core.repositoryformatversion=0
core.filemode=true
core.bare=false
core.logallrefupdates=true
core.ignorecase=true
core.autocrlf=true

Hier ist die entsprechende Ausgabe von der Windows-Seite:

core.symlinks=false
core.autocrlf=false
color.diff=auto
color.status=auto
color.branch=auto
color.interactive=true
pack.packsizelimit=2g
help.format=html
http.sslcainfo=/bin/curl-ca-bundle.crt
sendemail.smtpserver=/bin/msmtp.exe
diff.astextplain.textconv=astextplain
rebase.autosquash=true
http.proxy=
core.autocrlf=true
core.repositoryformatversion=0
core.filemode=false
core.bare=false
core.logallrefupdates=true
core.symlinks=false
core.ignorecase=true
core.hidedotfiles=dotGitOnly
core.eol=native
core.autocrlf=true

Und voll .gitattributes für das betreffende Depot

# Set default behaviour, in case users don't have core.autocrlf set.
* text=auto

*.php    text
*.twig   text
*.js     text
*.html   text diff=html
*.css    text
*.xml    text
*.txt    text
*.sh     text eol=lf
console  text

*.png    binary
*.jpg    binary
*.gif    binary
*.ico    binary
*.xslx   binary

  • Hinsichtlich autocrlf, Sie sagen, es ist in ~/.gitconfig festgelegt, aber wenn es in der .gitconfig Ihres Repositorys festgelegt ist, überschreibt es die globale Konfiguration. Hast du es mit der Einstellung versucht autocrlf in Ihrem Repository .gitconfig auf true?

    – Kezzer

    22. April 2013 um 9:16 Uhr

  • @KieranSenior Um ehrlich zu sein, habe ich das nicht. Wenn ich mir jetzt die Ausgabe ansehe, kann ich sehen, dass es sowohl in Mac als auch in Win zwei Zeilen von gibt autocrlf – und sie unterscheiden sich sogar in derselben Box vollständig voneinander. Ich denke also, wir müssen versuchen, alles Mögliche einzustellen autocrlfist zu true. Aber ich denke das .gitattribute sollte man hier auch was machen, oder? Da haben wir * text=auto in der ersten reihe…

    – Ville Mattila

    24. April 2013 um 22:15 Uhr

  • Ja, also text=auto würde tun, was in den Git-Dokumenten basierend auf meiner Antwort unten angegeben ist. Es sollte Ihre Zeilenenden automatisch konvertieren. Wenn Sie beispielsweise diese Option entfernt und Ihr Repository erneut ausgecheckt haben, sollten Sie nicht viele Dateien als geändert aufgelistet haben.

    – Kezzer

    25. April 2013 um 7:21 Uhr

  • Nur um hinzuzufügen, ich hoffe, wir weichen nicht vom ursprünglichen Problem ab, wie Sie in Ihrem Kommentar sagten autocrlf vars sollte auf true gesetzt werden. Der beste Ort, um es festzulegen, ist in Ihrer lokalen Repo-Instanz. Wenn text ist eingestellt auf auto dann werden, wie in den Dokumenten beim Einchecken angegeben, die Zeilenenden automatisch normalisiert. Meine folgende Antwort deckt diese beiden Situationen ab, daher denke ich, dass sie relevant ist, aber möglicherweise nicht genau auf Ihr Problem eingeht. Lassen Sie es mich ein wenig bearbeiten.

    – Kezzer

    25. April 2013 um 7:23 Uhr

  • Es scheint, dass es auch Unterschiede zwischen der Verwendung des eingebetteten SourceTree und des System-Git gibt – das Wechseln zur Systemversion meldet keine geänderten Dateien aufgrund von Problemen mit dem Zeilenende. Hinweis: in meinem Fall => eingebettete Version = 1.8.0 , Systemversion = 1.79.

    – Keith

    22. Mai 2013 um 4:20 Uhr

1644355811 981 SourceTree App sagt nicht festgeschriebene Anderungen sogar fur neu geklonte
Kezzer

Ich bin einer der SourceTree-Entwickler (ich entwickle eigentlich die Mac-Version des Produkts), also kann ich hoffentlich etwas helfen.

Windows-Rechner wandeln CRLF beim Commit in LF und LF beim Auschecken in CRLF um. autocrlf stellt sicher, dass alles im Repository LF ist. Die Option text = auto ist derjenige, an dem wir jedoch interessiert sind sagt in den Dokumenten:

Wenn Text auf “auto” gesetzt ist, wird der Pfad für die automatische Zeilenende-Normalisierung markiert. Wenn git entscheidet, dass der Inhalt Text ist, werden seine Zeilenenden beim Einchecken auf LF normalisiert.

Sie sehen also beim Einchecken, dass es heißt: “Hey, ich muss diese Zeilenenden normalisieren, weil sie nicht im LF-Format, sondern im CRLF-Format vorliegen.” und modifiziert somit Ihre Arbeitskopie, um die Arbeit zu erledigen, die sie tun soll. Normalerweise müssen Sie unter Mac/Linux nicht normalisieren, da sich alles in LF befindet, aber Git führt eine Überprüfung durch, da Sie möglicherweise aus einem Repository ausgecheckt haben, das zuvor unter Windows entwickelt wurde, oder vielleicht in einem Editor, der CRLF verwendet hat statt LF.

Kurz gesagt, Sie möchten wahrscheinlich alle diese Dateien erneut übertragen, da sie im LF-Format vorliegen sollten, aber stellen Sie auch sicher autocrlf = true (bearbeiten, immer auf wahr!) in Ihrem Windows-Repository, wie es in der Dokumentation steht:

Wenn Sie einfach CRLF-Zeilenenden in Ihrem Arbeitsverzeichnis haben möchten, unabhängig davon, mit welchem ​​Repository Sie arbeiten, können Sie die Konfigurationsvariable “core.autocrlf” setzen, ohne irgendwelche Attribute zu ändern.

Stellen Sie sich jedoch vor, dass das vorherige Zitat beim Einstellen war autocrlf sowohl für ein bestimmtes Repository als auch global.

Hoffentlich hilft dir das weiter, wenn nicht, kannst du gerne weitere Fragen stellen!


Hier ist ein guter SO-Beitrag zu: Zeilenenden: Warum sollte ich core.autocrlf=true in Git verwenden?


BEARBEITEN

Basierend auf der obigen Antwort müssen wir hier einige Dinge sicherstellen.

  • Dass Sie die relevanten Git-Optionen in Ihrer eingestellt haben .git/config
  • Wenn Sie CRLF-Zeilenenden beibehalten möchten, dann setzen Sie autocrlf=true
  • Wenn Sie beim Auschecken Ihres Repositorys nicht möchten, dass Ihre Zeilenenden automatisch konvertiert werden (was dazu führt, dass alle Ihre Dateien sofort den Status “modifiziert” haben), dann setzen Sie die text Option zu unset. Fügen Sie diese Option hinzu, wenn eine globale Git-Konfiguration auf einen Wert eingestellt ist, den Sie nicht möchten.
  • Wenn Sie für ein Projekt sowohl auf Windows als auch auf Mac arbeiten, ist es das Beste, was Sie haben text=auto und stellen Sie sicher, dass LF flächendeckend verwendet wird. Deshalb schleichen sich solche Probleme ein; weil Ihre Git-Konfigurationen unterschiedlich sind oder weil das anfängliche Projekt/Git-Setup unter Windows CRLF annimmt, wenn Ihr Mac LF annimmt.

  • Hallo! Vielen Dank für Ihre Antwort. Leider konnten wir das Problem nicht lösen, selbst wenn wir die Links zur Dokumentation durchgegangen sind. Ich habe meine Frage mit aktualisiert git config --list Ausgang und .gitattributes Wenn du oder jemand anderes herausfinden könnte, was falsch ist …

    – Ville Mattila

    20. April 2013 um 15:17 Uhr

  • Danke Ville, ich werde es mir anhand der aktualisierten Informationen noch einmal ansehen.

    – Kezzer

    22. April 2013 um 8:49 Uhr

  • Das Problem war für mich .gitattributes hätten * text=auto. Das Entfernen hat das Problem behoben. Wenn Sie die Datei vollständig löschen möchten, stellen Sie sicher, dass Sie die Änderungen bereitstellen, da Sie sonst nicht sehen, ob das Problem dadurch behoben wurde.

    – Omar

    9. Januar 2014 um 16:11 Uhr

  • Ich denke, es gibt einen Fehler im Quellbaum in 1.3.3.0. Weil core.autocrfl eine höhere Priorität hat als .gitattributes

    – Rofrol

    1. April 2014 um 15:24 Uhr

  • @rofrol SourceTree ruft nur Git auf, daher sollte Git in diesem Fall die Priorität bestimmen. Je lokaler eine Git-Konfiguration ist, desto höher ist die Priorität, die sie in der Kette hat, also wird wahrscheinlich core.autocrlf in der lokalen .git/config festgelegt kann überholen .gitattributes abhängig davon, wo sich diese befinden.

    – Kezzer

    20. Oktober 2014 um 15:59 Uhr

Ich verstehe es immer noch nicht zu 100%, aber für uns war das Problem das * text=auto in dem .gitattribute Datei im Repository. Ich habe nachgesehen, und das haben wir mit Sicherheit core.autocrlf=true an jedem Ort eingestellt, der für meinen Benutzer auf einem Windows-PC eingestellt werden kann. Ich wusste, dass es auch kein SourceTree-Problem war, da TortoiseGit und nur Windows Git (msysgit) alle das gleiche „Problem“ für dieses Repository hatten. Wirklich seltsames Verhalten – ich würde das Repo einmal klonen und sofort 11 “verschiedene” Dateien sehen, dann würde ich löschen und neu beginnen und der nächste Klon hätte 14 “verschiedene” Dateien.

Auskommentieren der * text=auto in dem .gitattribute Datei des Repositorys hat alles behoben. Es ist fast wie text=auto verhält sich nicht so wie autocrlf=true und letzteres ist deaktiviert, wenn das erste in gesetzt ist .gitattribute Datei. Aber das ist nicht das, was jeder Online-Leitfaden anzugeben scheint.

  • Das Auskommentieren von text=auto hat auch für mich Probleme behoben. +1 Seltsam.

    – Kairo

    29. Januar 2015 um 13:03 Uhr

  • Bei mir auch behoben :o)

    – phuzi

    14. August 2015 um 15:58 Uhr

  • Ich bin auf einem Mac dabei und bei mir hat folgendes funktioniert: erstellt a .gitattribute Datei mit * text=auto inside und speicherte es im gleichen Verzeichnis my .gitconfig oder .gitignore_global gefunden werden kann (höchstwahrscheinlich Ihr Benutzer root).

    – Leymannx

    17. September 2015 um 12:20 Uhr


  • Hat bei mir auch funktioniert! Danke

    – GEMI

    29. März 2016 um 6:48 Uhr

Ich habe die beiden folgenden Zeilen zur Konfigurationsdatei hinzugefügt. Das andere, was ich getan habe, war, auf das Kontrollkästchen “Staged Files” zu klicken und es dann zu deaktivieren, und alles wurde von selbst aktualisiert. Viel Glück.

text = auto 
autocrlf = true

  • Die Ironie, wenn du zurückkommst und deine eigene Antwort und Lösung findest.

    – vr_driver

    31. Mai 2021 um 5:47 Uhr

1644355811 165 SourceTree App sagt nicht festgeschriebene Anderungen sogar fur neu geklonte
Colt McCormack

Bin gerade auf dieses Problem gestoßen. Ein frischer Klon zog mehrere Dateien, die nicht nur nicht festgeschrieben waren, sondern auch viele Zeilen echten neuen Codes enthielten. git reflog zeigte nichts, es war kein tatsächlicher Commit, also kam ein getrennter HEAD nicht in Frage.

Nach etwa einer Stunde Recherche fanden wir die Ursache. Einer unserer *nix-Entwickler hatte höchstwahrscheinlich versehentlich Dateien zu einem Ordner hinzugefügt, der den gleichen Namen hatte wie der beabsichtigte, aber eine andere Großschreibung hatte. *nix-Umgebungen konnten diesen neuen Ordner problemlos handhaben, aber Windows (aufgrund der Groß-/Kleinschreibung) hat die beiden Ordner zusammengeführt.

Wenn Sie also beispielsweise zwei Ordner haben, test und Test, in denen sich jeweils eine file.txt befindet und diese beiden file.txt-Dateien nicht identisch sind, kopiert/ersetzt Windows tatsächlich eine davon (nicht sicher, in welcher Reihenfolge). klont Ordner hinein), wodurch die Datei “verändert” und nicht festgeschriebene Änderungen an “Test/file.txt” direkt nach einer Neuinstallation erstellt werden.

Beispiel:

test/
--file.txt (with contents of "This is a commit")

Test/
--file.txt (with contents of "This is a commit with some changes")

Dadurch werden immer neue nicht festgeschriebene Änderungen angezeigt, die aus dem Hinzufügen der Wörter „mit einigen Änderungen“ zu Test/file.txt bestehen, wenn auf einem Windows-Computer geklont wird, während * nix-basierte Computer kein Problem haben.

Dies spricht nicht unbedingt das Problem des OP an, sondern bezieht sich direkt auf die Frage im Titel. Hoffentlich hilft das jemandem da draußen.

Normalerweise ist diese Zeile in .gitattribute:

* text=auto

stellt automatisch sicher, dass alle Dateien, die Git als Text betrachtet, normalisierte (LF) Zeilenenden im Repository haben, selbst wenn git config core.autocrlf ist eingestellt auf false (Ursprünglich). Daher ändert Git die Dateien automatisch nach diesen Regeln.

Sie haben also folgende Möglichkeiten:

  • gehen Sie davon aus, dass die Normalisierungsänderungen korrekt sind (soweit sie an den Textdateien vorgenommen wurden) und übertragen Sie sie einfach, z

    $ git diff
    $ git commit -m "Introduce end-of-line normalization" -a
    
  • entfernen/deaktivieren Sie die automatische Normalisierung aus der .gitattribute Datei und setzen Sie die Dateien zurück,

  • Entfernen Sie den Index und scannen Sie die Dateien erneut, z

    $ rm -v .git/index # Or: git rm --cached -r .
    $ git reset --hard # Rewrite the Git index. Or: git add -u
    
  • alternativ, was auch immer Sie tun, versuchen Sie es mit Gewalt (-f), z.B git pull origin -f, git checkout master -fetc.,

  • benutzen git Befehlszeile, da dies ein Problem mit der SourceTree-App selbst sein könnte.

Sehen: Umgang mit Zeilenenden bei GitHub docs.

.

827470cookie-checkSourceTree App sagt nicht festgeschriebene Änderungen sogar für neu geklonte Repositorys – was könnte falsch sein?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy