Was ist die beste CRLF (Carriage Return, Zeilenvorschub) Behandlung Strategie mit Git?
-
05-07-2019 - |
Frage
Ich habe versucht zu begehen Dateien mit CRLF endende Linien, aber es ist fehlgeschlagen.
verbrachte ich einen ganzen Arbeitstag auf meinem Windows-Computer verschiedene Strategien versucht, und war fast zu stoppen gezogen versucht Git zu verwenden und stattdessen versuchen, Mercurial .
Bitte teilen nur eine Best Practice pro Antwort.
Lösung
Fast vier Jahre nach dieser Frage habe ich endlich gefunden eine Antwort, die mich vollständig erfüllt
Sehen Sie die Details in Github: help 's Guide zu Umgang mit Zeilenenden .
Git können Sie die Zeilenende Eigenschaften für ein setzen Repo direkt die Textattribut in der Verwendung
.gitattributes
Datei. Diese Datei hat sich verpflichtet, in die Repo- und überschreiben diecore.autocrlf
Einstellung, so dass Sie ein konsistentes Verhalten für alle zu gewährleisten Benutzer unabhängig von ihren git Einstellungen.
So
Der Vorteil hierbei ist, dass Ihr Ende der Leitung Konfiguration bewegt sich nun mit Ihrem Repository und Sie brauchen nicht darüber, ob oder nicht Mitarbeiter kümmern haben die richtigen globalen Einstellungen.
Hier ist ein Beispiel für eine .gitattributes
Datei
# Auto detect text files and perform LF normalization
* text=auto
*.cs text diff=csharp
*.java text diff=java
*.html text diff=html
*.css text
*.js text
*.sql text
*.csproj text merge=union
*.sln text merge=union eol=crlf
*.docx diff=astextplain
*.DOCX diff=astextplain
# absolute paths are ok, as are globs
/**/postinst* text eol=lf
# paths that don't start with / are treated relative to the .gitattributes folder
relative/path/*.txt text eol=lf
Es ist eine bequeme Sammlung von ready-Dateien für die beliebtesten Programmiersprachen verwenden .gitattributes. Es ist nützlich, um Ihnen den Einstieg.
Sobald Sie erstellt oder angepasst .gitattributes
, sollten Sie eine durchführen einmal und für alles Zeilenende wieder Normalisierung .
Beachten Sie, dass die GitHub Desktop- App kann eine .gitattributes
Datei vorschlagen und schaffen, nachdem Sie Git Ihr Projekt öffnen Repo in der App. Um zu versuchen, dass, klicken Sie auf das Zahnrad-Symbol (in der rechten oberen Ecke)> Repository-Einstellungen ...> Zeilenende und Attribute. Sie werden gefragt, die empfohlene hinzuzufügen .gitattributes
und wenn Sie einverstanden sind, wird die App auch eine Normalisierung aller Dateien im Repository durchführen.
Schließlich Mind the das Ende der Linie Artikel mehr Hintergrund stellt und erklärt, wie Git entwickelt hat Bezug auf die bei der Hand. Ich halte dies für Pflichtlektüre .
Sie haben wahrscheinlich Benutzer in Ihrem Team, die EGit oder JGit verwenden (Tools wie Eclipse und Teamcity sie verwenden), um ihre Änderungen zu übernehmen. Dann bist du kein Glück, als @gatinueta in dieser Antwort Äußerungen erklärt:
Mit dieser Einstellung werden Sie nicht vollständig erfüllen, wenn man die Leute mit Egit oder JGit in Ihrem Team zu arbeiten hat, da diese Werkzeuge nur .gitattributes ignorieren und glücklich in CRLF Dateien überprüfen https://bugs.eclipse.org/bugs/show_bug.cgi?id=342372
Ein Trick könnte sein, um sie in einem anderen Mandanten ihre Änderungen haben zu begehen, sagen wir SourceTree . Unser Team zurück bevorzugt dann, dass Werkzeug EGit für viele Anwendungsfälle des Eclipse.
Wer hat gesagt, Software einfach ist? : - /
Andere Tipps
Sie Zeilenende nicht konvertieren. Es ist nicht die Aufgabe des VCS Daten zu interpretieren - nur speichern und Version davon. Jeder moderne Texteditor sowieso beide Arten von Zeilenenden lesen kann.
Sie wollen fast immer autocrlf=input
wenn Sie wirklich wissen, was Sie tun.
Einige zusätzliche Kontext unter:
Es sollte entweder
core.autocrlf=true
sein, wenn Sie DOS endet odercore.autocrlf=input
wenn Sie es vorziehen Unix-Zeilenumbrüche. In beiden Fällen wird Ihre Git-Repository nur LF haben, was das Richtige ist. Das einzige Argument fürcore.autocrlf=false
war, dass die automatische Heuristik falsch einige binäre als Text erfassen und dann wird Ihre Fliese beschädigt. Damit,core.safecrlf
Option wurde eingeführt, um einen Benutzer zu warnen, wenn eine unumkehrbare Änderung geschieht. In der Tat gibt es zwei Möglichkeiten der irreversable Veränderungen - gemischt Zeilenende in Textdatei, in dieser Normierung ist wünschenswert, so kann diese Warnung ignoriert werden, oder (Sehr unwahrscheinlich), die falsch erkannt Git Ihre Binär-Datei als Text. Dann müssen Sie Attribute verwenden, um sagen Git, dass diese Datei binär ist.
Der obige Absatz wurde ursprünglich von einem Thread auf gmane.org gezogen, aber es nach unten, da gegangen ist.
Zwei alternative Strategien zu erhalten konsistent über Zeilenenden in gemischten Umgebungen (Microsoft + Linux + Mac):
A. Globale pro Alle Repositorys Setup-
1) Convert alle zu einem Format
find . -type f -not -path "./.git/*" -exec dos2unix {} \;
git commit -a -m 'dos2unix conversion'
2) Stellen Sie core.autocrlf
auf Linux / UNIX oder input
auf MS Windows (Repository oder global)
true
git config --global core.autocrlf input
3) [Optional] Satz core.safecrlf
true
(zu stoppen) oder warn
(zu singen :) zusätzliche Wachen hinzufügen zu vergleichen, wenn die umgekehrte Newline Transformation in der gleichen Datei führen würde
git config --global core.safecrlf true
B. Oder pro Repository-Setup
1) Convert alle zu einem Format
find . -type f -not -path "./.git/*" -exec dos2unix {} \;
git commit -a -m 'dos2unix conversion'
2) in .gitattributes
Datei auf Ihr Repository
echo "* text=auto" > .gitattributes
git add .gitattributes
git commit -m 'adding .gitattributes for unified line-ending'
Sie nicht über Ihre Binärdateien Sorge -. Git intelligent genug, um über sie sein sollte
Versuchen Sie, die core.autocrlf
Konfigurationsoption Einstellung true
. Haben Sie auch einen Blick auf die core.safecrlf
Option.
Eigentlich klingt es wie core.safecrlf
vielleicht schon in Ihrem Repository, weil (Hervorhebung von mir) eingestellt werden:
Wenn dies nicht der Fall für die aktuelle Einstellung von core.autocrlf ist, git wird die Datei ablehnen .
Wenn dies der Fall ist, dann sollten Sie überprüfen, ob Ihr Text-Editor konfiguriert ist konsequent Zeilenende zu verwenden. Sie werden wahrscheinlich auf Probleme stoßen, wenn eine Textdatei, die eine Mischung von LF und CRLF Zeilenenden enthält.
Schließlich habe ich das Gefühl, dass die Empfehlung einfach „verwenden, was Sie gegeben“ und verwenden LF Linien auf Windows beendet wird mehr Probleme verursachen als sie löst. Git hat die oben genannten Optionen zu versuchen, Zeilenende in einer vernünftigen Art und Weise zu handhaben, so macht es Sinn, sie zu nutzen.
Mit core.autocrlf=false
aus alle Dateien gestoppt, sobald aktualisiert markiert wird, wie ich sie in meinem Visuelle ausgecheckt Studio 2010 Projekt. Die beiden anderen Mitglieder des Entwicklungsteams sind auch mit Windows-Systemen so eine gemischte Umgebung nicht ins Spiel gekommen, aber die Standardeinstellungen, die mit dem Repository kam immer markiert alle Dateien als unmittelbar nach dem Klonen aktualisiert.
Ich denke, in der unteren Zeile zu finden ist, was CRLF Einstellung für Ihre Umgebung. Vor allem, da in vielen anderen Repositories auf unseren Linux-Boxen Einstellung autocrlf = true
bessere Ergebnisse liefert.
20 Jahre später, und wir sind nach wie vor mit der Linie zu tun Unterschiede zwischen OSes Ende ... traurig.
Dies sind die beiden Optionen für Fenster und Visual Studio Benutzer diesen Anteil Code mit Mac oder Linux Benutzer . Für eine längere Erklärung, lesen Sie die gitattributes Handbuch .
* text = auto
In Ihrem Repo .gitattributes
-Datei hinzu:
* text=auto
Damit werden alle Dateien mit LF
Zeilenenden im Repo normalisieren.
Und je nach Betriebssystem (core.eol
Einstellung), Dateien im Arbeits Baum normalisiert werden für Unix-basierte Systeme oder LF
für Windows-Systeme CRLF
.
Dies ist die Konfiguration, die Microsoft .NET repos Verwendung.
Beispiel:
Hello\r\nWorld
Wird in der Repo normalisiert werden immer als:
Hello\nWorld
Beim Auschecken wird die Arbeitsstruktur im Windows konvertiert werden:
Hello\r\nWorld
Beim Auschecken wird der Arbeits Baum in Mac gelassen werden, wie:
Hello\nWorld
Hinweis: Wenn Ihr Repo bereits Dateien nicht normalisiert enthält, wird
git status
diese Dateien zeigen, wie vollständig das nächste Mal, wenn Sie sie jede mögliche Änderung vornehmen geändert, und es könnte ein Schmerz für andere Benutzer zu später ihre Änderungen zusammenführen. Siehe erfrischend ein Repository nach Endungen Linie , um weitere Informationen zu ändern.
core.autocrlf = true
Wenn text
ist nicht spezifiziert in der .gitattributes
Datei, Git verwendet den core.autocrlf
Konfigurationsvariable, um zu bestimmen, ob die Datei konvertiert werden soll.
Für Windows-Benutzer, git config --global core.autocrlf true
ist eine gute Option, weil:
- Dateien sind normalisierte Zeilenende
LF
nur, wenn hinzugefügt zu dem Repo. Wenn Dateien nicht normalisiert im Repo sind, wird diese Einstellung sie nicht berühren. - werden alle Textdateien
CRLF
Zeilenende im Arbeitsverzeichnis umgewandelt.
Das Problem bei diesem Ansatz ist, dass:
- Wenn Sie ein Windows-Benutzer mit
autocrlf = input
sind, werden Sie eine Reihe von Dateien mitLF
Zeilenenden sehen. Nicht eine Gefahr für den Rest des Teams, weil Ihre Commits noch mitLF
Zeilenenden normalisiert werden. - Wenn Sie ein Windows-Benutzer mit
core.autocrlf = false
sind, werden Sie eine Reihe von Dateien mitLF
Zeilenenden sehen und Sie können Dateien mitCRLF
Zeilenenden in die Repo einführen. - Die meisten Mac-Anwender verwenden
autocrlf = input
und kann Dateien mitCRLF
Dateiendungen, die wahrscheinlich von Windows-Benutzern mitcore.autocrlf = false
erhalten.
Dies ist nur eine Abhilfe Lösung:
Im Normalfall verwendet die Lösungen, die mit git versandt werden. Diese arbeiten sehr in den meisten Fällen. Force LF, wenn Sie die Entwicklung unter Windows und Unix-basierten Systemen gemeinsam nutzen, indem Sie .gitattributes .
In meinem Fall gab es> 10 Programmierer ein Projekt in Windows zu entwickeln. Dieses Projekt wurde geprüft mit CRLF und gibt es keine Möglichkeit, LF zu erzwingen.
Einige Einstellungen wurden intern geschrieben auf meinem Rechner ohne Einfluss auf das LF-Format; so wurden einige Dateien global verändert auf jeder kleinen Dateiänderung LF.
Meine Lösung:
Windows-Maschinen: Lassen Sie alles, wie es ist. Die Sorge um nichts, da Sie ein Standard-Windows ‚Eigenbrötler‘ Entwickler sind und Sie haben so zu handhaben: „Es gibt kein anderes System in der weiten Welt, ist es“
Unix-Maschinen
-
Fügen Sie folgende Zeilen in einem
[alias]
Abschnitt config. Dieser Befehl listet alle geändert (d geändert / neu) Dateien:lc = "!f() { git status --porcelain \ | egrep -r \"^(\?| ).\*\\(.[a-zA-Z])*\" \ | cut -c 4- ; }; f "
-
Konvertieren alle, die geändert Dateien in DOS-Format:
unix2dos $(git lc)
-
Optional ...
-
Erstellen Sie eine git für diese Haken Aktion diesen Prozess zu automatisieren
-
Mit params und schließen Sie sie und die
grep
Funktion ändern, dass nur bestimmte Dateinamen übereinstimmen, z.B .:... | egrep -r "^(\?| ).*\.(txt|conf)" | ...
-
Fühlen Sie sich frei, um es noch einfacher zu machen, indem eine zusätzliche Verknüpfung mit:
c2dos = "!f() { unix2dos $(git lc) ; }; f "
... und feuern die konvertierte Sachen, indem Sie
git c2dos
-
Ich habe Stunden damit verbracht, mit der bestmöglichen Nutzung von .gitattributes
zu kommen, um endlich zu erkennen, dass ich nicht auf sie zählen kann.
Leider solange JGit-basierte Editoren existieren (was nicht .gitattributes
korrekt verarbeiten kann), ist die sichere Lösung LF zu zwingen, überall sogar auf Editor-Ebene.
Verwenden Sie die folgenden anti-CRLF
Desinfektionsmittel.
-
Windows / Linux-Clients:
core.autocrlf=input
-
begangen
.gitattributes
:* text=auto eol=lf
-
engagierte
.editorconfig
( http://editorconfig.org/ ) welche Art von standardisierten Format, kombiniert mit Editor-Plugins:
--- UPDATE 2 ---
Die dafaults von git-Client wird in den meisten Fällen funktionieren. Selbst wenn Sie nur die Fenster nur Clients, Linux nur Kunden oder beides. Diese sind:
- Fenster.
core.autocrlf=true
bedeutet Linien zu CRLF auf Kasse umwandeln und konvertieren Linien LF, wenn das Hinzufügen von Dateien - Linux:.
core.autocrlf=input
Mittel nicht Linien auf Kasse konvertieren (keine Notwendigkeit, da Dateien erwartet werden, mit LF begangen werden) und konvertieren Linien LF (falls erforderlich), wenn das Hinzufügen von Dateien
Die Eigenschaft kann in verschiedenen Bereichen eingestellt werden. Ich würde ausdrücklich vorschlagen im --global
Umfang einstellen, einige IDE Probleme am Ende beschrieben zu vermeiden.
git config core.autocrlf
git config --global core.autocrlf
git config --system core.autocrlf
git config --local core.autocrlf
git config --show-origin core.autocrlf
Auch würde ich dringend entmutigen mit git config --global core.autocrlf false
(falls Sie nur Windows-Clients) im Gegensatz zu dem, was vorgeschlagen wird, git Dokumentation . Festlegen auf false werden die Dateien mit CRLF im Repo begehen. Aber es gibt wirklich keinen Grund. Man kann nie wissen, ob Sie das Projekt mit Linux-Benutzern teilen müssen. Außerdem ist es ein zusätzlicher Schritt für jeden Client, der das Projekt anstelle der Verwendung von Standardeinstellung verbindet.
Jetzt für einige spezielle Fälle von Dateien (z *.bat
*.sh
), die Sie wollen, dass sie mit LF oder CRLF abgemeldeten werden können Sie mit .gitattributes
Um es zusammenzufassen-up für mich, die best practice ist:
- Stellen Sie sicher, dass jede nicht-Binärdatei mit LF auf git Repo (Standardverhalten) verpflichtet.
- Verwenden Sie diesen Befehl, um sicherzustellen, dass keine Dateien mit CRLF begangen werden:
git grep -I --files-with-matches --perl-regexp '\r' HEAD
( Hinweis: auf Windows-Clients funktioniert nur durchgit-bash
und auf Linux-Clients nur bei Verwendung von--with-libpcre
in./configure
kompiliert). - Wenn Sie diese Dateien finden, indem Sie den obigen Befehl ausgeführt wird, korrigieren.
- Verwenden Sie nur das Nötigste
.gitattributes
- Weisen Sie die Benutzer die
core.autocrlf
oben auf die Standardwerte beschrieben eingestellt werden. - Zählen Sie nicht zu 100% auf die Anwesenheit von
.gitattributes
. git-Clients von IDEs ignorieren sie oder behandeln sie differrently.
Wie gesagt einige Dinge können in git Attribute hinzugefügt werden:
# Always checkout with LF
*.sh text eol=lf
# Always checkout with CRLF
*.bat text eol=crlf
Ich glaube, einige andere sichere Optionen für .gitattributes
stattdessen die automatische Erkennung für binäre Dateien zu verwenden:
-
-text
(z für*.zip
oder*.jpg
Dateien:.. Wird nicht als Text behandelt werden, also keine Zeilenende Umwandlungen versucht wird Diff durch Konvertierungsprogramme möglich sein könnte) -
text !eol
(beispielsweise für*.java
,*.html
: Behandelte als Text,aber EOL Stil Präferenz ist nicht gesetzt. So Client Einstellung verwendet wird.) -
-text -diff -merge
(z für*.hugefile
. Nicht als Text behandelt Kein Diff / Merge möglich)
--- PREVIOUS UPDATE ---
Ein painful Beispiel ein Kunde, die Dateien zu Unrecht begehen wird:
netbeans 8.2 (Windows), wird fälschlicherweise alle Textdateien begehen mit CRLFs, es sei denn, Sie haben explizit gesetzt core.autocrlf
als global . Dies steht im Widerspruch zu dem Standard-Git-Client Verhalten und verursacht viele Probleme später, während der Aktualisierung / Verschmelzung. Dies ist, was einige macht Dateien unterschiedlich erscheinen (obwohl sie nicht sind) , auch wenn Sie zurückkommen .
Das gleiche Verhalten in Netbeans geschieht, selbst wenn Sie richtig .gitattributes
zu einem Projekt hinzugefügt haben.
Mit dem folgenden Befehl nach einem Commit, wird zumindest helfen Sie frühzeitig erkennen, ob Ihre git Repo-Linie hat Probleme endet: git grep -I --files-with-matches --perl-regexp '\r' HEAD