Wie zwinge ich git, den Hauptzweig auszuchecken und Zeilenumbrüche zu entfernen, nachdem ich Dateien mit dem Attribut "text" normalisiert habe?

99

Okay, also habe ich die Datei .gitattributesmit solchen Zeilen hinzugefügt

*.css text
*.js text
etc...

Ich folgte dann den Anweisungen unter http://git-scm.com/docs/gitattributes#_checking-out_and_checking-in

$ rm .git/index     # Remove the index to force Git to
$ git reset         # re-scan the working directory
$ git status        # Show files that will be normalized
$ git add -u
$ git add .gitattributes
$ git commit -m "Introduce end-of-line normalization"

Aber jetzt hat meine Arbeitskopie noch den Wagenrücklauf! Ich habe nicht verfolgte Dateien, die ich behalten möchte. Wie kann ich den Hauptzweig mit den normalisierten Dateien erneut auschecken?

Ich weiß, dass die Dateien im Repository normalisiert sind, da ich beim Klonen des Repos alle Dateien ohne Wagenrücklauf habe.

Jason
quelle

Antworten:

262

Ah ah! Überprüfen Sie das vorherige Commit und dann den Master.

git checkout HEAD^
git checkout -f master
Jason
quelle
5
Vielen Dank für diese Problemumgehung, aber es ist ein eklatantes Problem in git, dass "checkout -f" das erneute Auschecken nicht wirklich erzwingt. Eine andere Problemumgehung wäre, zuerst alle Arbeitskopiedateien zu entfernen (dh alles außer .git dir).
Pfalcon
Ah ja, danke dafür! Als ich das höre, schätze ich, wir könnten einfach die Dateien von Interesse entfernen und die Kasse ausführen. Für mich gab es eigentlich nur eine Datei, die ich korrigieren wollte. Aber natürlich können es alle Dateien sein, Hunderte oder Tausende.
Jason
Dies schlägt unter git 1.8.3 (mac) fehl mit: error: pathspec 'HEAD ^' stimmte nicht mit Dateien überein, die git bekannt sind.
Val
@dval, sehen Sie sich die Änderungen an diesem Beitrag an und Sie werden eine alternative Möglichkeit sehen, dies zu tun. Ich laufe auch auf einem Mac, und das hat bei mir funktioniert. Ich ermutige Sie auch, Ihr Git auf 2+ zu aktualisieren, und Sie können Homebrew verwenden, um dies auf sichere und wartbare Weise zu tun.
Jason
2
Das funktioniert nicht wirklich. GIT aktualisiert nur Dateien, die sich zwischen den beiden Commits geändert haben (mit einigen Ausnahmen). Wenn ein Repository brandneu ist, z. Nur zwei Commits und der erste ist leer, dann funktioniert diese Lösung. Andernfalls müssen Sie alle Dateien zwangsweise löschen, wie in der Antwort von mechsin beschrieben.
jstine
16

Wie andere bereits betont haben, könnte man einfach alle Dateien im Repo löschen und sie dann auschecken. Ich bevorzuge diese Methode und sie kann mit dem folgenden Code durchgeführt werden

git ls-files -z | xargs -0 rm
git checkout -- .

oder eine Zeile

git ls-files -z | xargs -0 rm ; git checkout -- .

Ich benutze es die ganze Zeit und habe noch keine Nachteile gefunden!

Für einige weitere Erklärung, die -zanfügt ein Null - Zeichen an das Ende eines jeden Eintrag ausgegeben durch ls-files, und der -0sagt xargsdie Ausgabe wurde Empfangen von diesen Null - Zeichen zu begrenzen.

Mechin
quelle