Fast vier Jahre nachdem ich diese Frage gestellt habe, habe ich endlich eine Antwort gefunden, die mich vollkommen zufriedenstellt !
Weitere Informationen finden Sie in github: Hilfe zum
Umgang mit Zeilenenden .
Mit Git können Sie die Zeilenende-Eigenschaften für ein Repo direkt mithilfe des Textattributs in der
.gitattributes
Datei festlegen . Diese Datei wird in das Repo übernommen und überschreibt die core.autocrlf
Einstellung, sodass Sie ein konsistentes Verhalten für alle Benutzer unabhängig von ihren Git-Einstellungen sicherstellen können.
Und somit
Dies hat den Vorteil, dass Ihre Konfiguration am Ende der Leitung jetzt mit Ihrem Repository übertragen wird und Sie sich keine Gedanken mehr darüber machen müssen, ob Mitarbeiter über die richtigen globalen Einstellungen verfügen oder nicht.
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 gibt eine praktische Sammlung gebrauchsfertiger .gitattributes-Dateien für die beliebtesten Programmiersprachen. Es ist nützlich, um Ihnen den Einstieg zu erleichtern.
Sobald Sie Ihre erstellt oder angepasst haben .gitattributes
, sollten Sie eine endgültige Normalisierung der Zeilenenden durchführen .
Beachten Sie, dass die GitHub Desktop- App eine .gitattributes
Datei vorschlagen und erstellen kann, nachdem Sie das Git-Repo Ihres Projekts in der App geöffnet haben. Klicken Sie dazu auf das Zahnradsymbol (in der oberen rechten Ecke)> Repository-Einstellungen ...> Zeilenenden und Attribute. Sie werden aufgefordert, die empfohlenen .gitattributes
Dateien hinzuzufügen. Wenn Sie damit einverstanden sind, führt die App auch eine Normalisierung aller Dateien in Ihrem Repository durch.
Schließlich bietet der Artikel Mind the End of Your Line mehr Hintergrundinformationen und erklärt, wie sich Git in diesen Fragen entwickelt hat. Ich halte dies für erforderlich .
Sie haben wahrscheinlich Benutzer in Ihrem Team, die EGit oder JGit verwenden (Tools wie Eclipse und TeamCity verwenden sie), um ihre Änderungen festzuschreiben. Dann haben Sie kein Glück, wie @gatinueta in den Kommentaren dieser Antwort erklärt hat:
Diese Einstellung wird Sie nicht vollständig zufriedenstellen, wenn in Ihrem Team Mitarbeiter mit Egit oder JGit arbeiten, da diese Tools .gitattributes einfach ignorieren und die CRLF-Dateien https://bugs.eclipse.org/bugs/show_bug.cgi einchecken . id = 342372
Ein Trick könnte darin bestehen, dass sie ihre Änderungen auf einem anderen Client festschreiben, z . B. SourceTree . Unser damaliges Team hat dieses Tool für viele Anwendungsfälle Eclipse's EGit vorgezogen.
Wer hat gesagt, dass Software einfach ist? : - /
.gitattributes
?.gitattributes
GitHub für Windows für Ihr Projekt vorschlägt? Ich habe GitHub für Windows installiert, die GUI-Version gestartet und konnte keine Option für.gitattributes
Vorschläge finden.core.autocrlf = false
- ich bevorzuge LF überall, aber einige Windows-Tools wie Visual Studio bestehen auf CRLF-Endungen in bestimmten Dateien (und mischen sie sogar in einigen ..). Das Nicht-Munging von Leitungsenden ist die sicherste Option. Wenn Sie wissen, was Sie tun, würde ich wahrscheinlichcore.autocrlf = input
Ausnahmen für Projekte unter Windows verwenden und machen, von denen Sie wissen, dass sie empfindlich auf Zeilenenden reagieren. Wie andere betonen, unterstützt jetzt jeder anständige Texteditor LF-Endungen. Ich denke tatsächlich, dasscore.autocrlf = true
es wahrscheinlich mehr Probleme verursachen kann, als es verhindert.Konvertieren Sie keine Zeilenenden. Es ist nicht die Aufgabe des VCS, Daten zu interpretieren - sie nur zu speichern und zu versionieren. Jeder moderne Texteditor kann sowieso beide Arten von Zeilenenden lesen.
quelle
Sie wollen fast immer, es
autocrlf=input
sei denn, Sie wissen wirklich, was Sie tun.Einige zusätzliche Zusammenhänge unten:
Der obige Absatz wurde ursprünglich aus einem Thread auf gmane.org gezogen, ist aber seitdem gesunken.
quelle
core.autocrlf=input
ist die kanonische Antwort. Für die meisten Anwendungsfälle,core.autocrlf=true
undcore.autocrlf=false
sind übereifrig (... gegens aber ebenso schreckliche Art und Weise, natürlich) und damit eigen destruktiv. "Git für Windows" sollte eigentlich mit "Checkout as-is, Commit-Zeilenenden im Unix-Stil" (dhcore.autocrlf=input
) als Standard-Newline-Strategie ausgeliefert werden. Es war nicht so. Also hier, wir hier - im verdammten Jahr 2015 - debattieren immer noch endlos darüber.Zwei alternative Strategien, um in gemischten Umgebungen (Microsoft + Linux + Mac) konsistent über Zeilenenden zu werden:
A. Global für alle Repositorys einrichten
1) Konvertieren Sie alle in ein Format
2) Set
core.autocrlf
aninput
auf Linux / UNIX odertrue
auf MS Windows (Repository oder global)3) [Optional]
core.safecrlf
auftrue
(zum Stoppen) oderwarn
(zum Singen :) setzen, um einen zusätzlichen Schutz hinzuzufügen, der vergleicht, ob die umgekehrte Newline-Transformation zu derselben Datei führen würdeB. Oder per Repository-Setup
1) Konvertieren Sie alle in ein Format
2) Fügen Sie
.gitattributes
Ihrem Repository eine Datei hinzuMach dir keine Sorgen um deine Binärdateien - Git sollte klug genug sein.
Weitere Informationen zu safecrlf / autocrlf-Variablen
quelle
dos2unix
ist ein Kommandozeilen-Tool, das Sie je nach System möglicherweise zusätzlich installieren müssendos2unix
- es besteht die Gefahr einer Beschädigung.git/index
und wir müssen es nicht auf jede Datei anwenden. Es ist besser, so etwas wie zu verwendenfind ./ -name "*.html"
und anzugeben, auf welche Dateien Sie es anwenden möchten.find
Linien beachten Sie : die ,dos2unix
die mit Git kommt versendeten für Windows hat einen eigentümlichen (IMO idiotisch und gefährlich) Verhalten, ohne Argumente: Statt auf UNIX zu ändern, es schaltet das Zeilenformat (DOS <-> UNIX )Versuchen Sie, die
core.autocrlf
Konfigurationsoption auf einzustellentrue
. Schauen Sie sich auch diecore.safecrlf
Option an.Eigentlich klingt es so, als ob
core.safecrlf
es bereits in Ihrem Repository festgelegt ist, weil (Hervorhebung von mir):Wenn dies der Fall ist, möchten Sie möglicherweise überprüfen, ob Ihr Texteditor so konfiguriert ist, dass Zeilenenden konsistent verwendet werden. Sie werden wahrscheinlich auf Probleme stoßen, wenn eine Textdatei eine Mischung aus LF- und CRLF-Zeilenenden enthält.
Schließlich bin ich der Meinung, dass die Empfehlung, einfach "das zu verwenden, was Ihnen gegeben wurde" und LF-terminierte Leitungen unter Windows zu verwenden, mehr Probleme verursacht als löst. Git hat die oben genannten Optionen, um zu versuchen, Zeilenenden auf vernünftige Weise zu behandeln. Daher ist es sinnvoll, sie zu verwenden.
quelle
Die Verwendung von
core.autocrlf=false
hat verhindert, dass alle Dateien als aktualisiert markiert werden, sobald ich sie in meinem Visual Studio 2010- Projekt ausgecheckt habe. Die beiden anderen Mitglieder des Entwicklungsteams verwenden ebenfalls Windows-Systeme, sodass keine gemischte Umgebung ins Spiel kam. In den Standardeinstellungen des Repositorys wurden jedoch alle Dateien unmittelbar nach dem Klonen als aktualisiert markiert.Ich denke, das Endergebnis ist zu finden, welche CRLF-Einstellung für Ihre Umgebung funktioniert. Zumal in vielen anderen Repositorys unserer Linux-Boxen die Einstellung
autocrlf = true
bessere Ergebnisse liefert.Über 20 Jahre später haben wir es immer noch mit Unterschieden zwischen den Betriebssystemen zu tun ... traurig.
quelle
Dies sind die beiden Optionen für Windows- und Visual Studio- Benutzer, die Code für Mac- oder Linux- Benutzer freigeben. Eine ausführliche Erklärung finden Sie im Handbuch zu gitattributes .
* text = auto
Fügen Sie in der
.gitattributes
Datei Ihres Repos Folgendes hinzu:Dadurch werden alle Dateien mit
LF
Zeilenenden im Repo normalisiert .Abhängig von Ihrem Betriebssystem (
core.eol
Einstellung) werden die Dateien im ArbeitsbaumLF
für Unix-basierte Systeme oderCRLF
für Windows-Systeme normalisiert .Dies ist die Konfiguration, die Microsoft .NET- Repos verwenden.
Beispiel:
Wird im Repo immer wie folgt normalisiert:
Beim Auschecken wird der Arbeitsbaum in Windows konvertiert in:
Beim Auschecken bleibt der Arbeitsbaum in Mac wie folgt:
core.autocrlf = true
Wenn
text
in der.gitattributes
Datei nichts angegeben ist, verwendet Git diecore.autocrlf
Konfigurationsvariable, um zu bestimmen, ob die Datei konvertiert werden soll.Für Windows-Benutzer
git config --global core.autocrlf true
ist dies eine großartige Option, da:LF
Zeilenenden normalisiert, wenn sie dem Repo hinzugefügt werden . Wenn das Repo Dateien enthält, die nicht normalisiert sind, werden sie durch diese Einstellung nicht berührt.CRLF
im Arbeitsverzeichnis in Zeilenenden konvertiert .Das Problem bei diesem Ansatz ist, dass:
autocrlf = input
, wird eine Reihe von Dateien mitLF
Zeilenenden angezeigt. Keine Gefahr für den Rest des Teams, da Ihre Commits weiterhin mitLF
Zeilenenden normalisiert werden.core.autocrlf = false
, werden eine Reihe von Dateien mitLF
Zeilenenden angezeigt, und Sie können Dateien mitCRLF
Zeilenenden in das Repo einfügen.autocrlf = input
und erhalten möglicherweise Dateien mitCRLF
Dateiendungen, wahrscheinlich von Windows-Benutzern mitcore.autocrlf = false
.quelle
git config --global core.autocrl true
. Du meinstgit config --global core.autocrlf true
.--- UPDATE 3 --- (widerspricht nicht UPDATE 2)
In Anbetracht des Falls, dass Windows-Benutzer lieber arbeiten
CRLF
und Linux / Mac-Benutzer lieberLF
an Textdateien arbeiten. Bereitstellung der Antwort aus der Sicht eines Repository-Betreuers :Für mich ist die beste Strategie (weniger Probleme zu lösen): Behalten Sie alle Textdateien mit
LF
Inside Git Repo bei, auch wenn Sie an einem Windows-Projekt arbeiten. Geben Sie den Kunden dann die Freiheit, an dem von ihnen bevorzugten Zeilenendstil zu arbeiten , vorausgesetzt, sie wählen einencore.autocrlf
Eigenschaftswert aus, der Ihre Strategie (LF on Repo) berücksichtigt, während sie Dateien für das Festschreiben bereitstellen.Staging ist das, was viele Leute verwirren, wenn sie versuchen zu verstehen, wie Newline-Strategien funktionieren. Es ist wichtig, die folgenden Punkte zu verstehen, bevor Sie den richtigen Wert für die
core.autocrlf
Immobilie auswählen :.git/
Unterverzeichnis mit konvertierten Zeilenenden (abhängig vomcore.autocrlf
Wert in Ihrer Client-Konfiguration). All dies erfolgt vor Ort.core.autocrlf
ist wie eine Antwort auf die Frage (genau dieselbe Frage auf allen Betriebssystemen):false:
" mach keines der oben genannten ",input:
" mach nur b "true
: " mach a und und b "Glücklicherweise
core.autocrlf: true
, Linux / Maccore.autocrlf: false
:) sind mit der LF-Only-Repo- Strategie kompatibel .Bedeutung : Windows-Clients werden beim Auschecken des Repositorys standardmäßig in CRLF konvertiert und beim Hinzufügen zum Festschreiben in LF konvertiert. Und Linux-Clients führen standardmäßig keine Konvertierungen durch. Dies hält theoretisch Ihr Repo nur für.
Unglücklicherweise:
core.autocrlf
Wert nicht berücksichtigencore.autocrlf=false
Zum Beispiel verwenden sie eine Datei mit CRLF und fügen sie zum Festschreiben hinzu.Um ASAP-Nicht-lf-Textdateien zu erkennen, die von den oben genannten Clients festgeschrieben wurden , können Sie den Anweisungen in --- Update 2 ---: (
git grep -I --files-with-matches --perl-regexp '\r' HEAD
auf einem Client folgen , der mit:--with-libpcre
flag kompiliert wurde ).Und hier ist der Haken : . Ich als Repo-Betreuer behalte eine,
git.autocrlf=input
damit ich falsch festgeschriebene Dateien reparieren kann, indem ich sie erneut für die Festschreibung hinzufüge. Und ich stelle einen Festschreibungstext bereit: "Korrigieren falsch festgeschriebener Dateien".Soweit
.gitattributes
bekannt. Ich zähle nicht darauf, weil es mehr UI-Clients gibt, die es nicht verstehen. Ich verwende es nur, um Hinweise für Text- und Binärdateien bereitzustellen und möglicherweise einige außergewöhnliche Dateien zu kennzeichnen, die überall die gleichen Zeilenenden behalten sollten:Frage: Aber warum interessieren wir uns überhaupt für die Newline-Handling-Strategie?
Antwort: Um ein Festschreiben eines einzelnen Buchstabens zu vermeiden, wird es als Änderung mit 5000 Zeilen angezeigt, nur weil der Client, der die Änderung durchgeführt hat, die vollständige Datei automatisch von crlf in lf (oder umgekehrt) konvertiert hat, bevor er sie zum Festschreiben hinzufügt. Dies kann sehr schmerzhaft sein, wenn es sich um eine Konfliktlösung handelt . Oder es könnte in einigen Fällen die Ursache für unangemessene Konflikte sein.
--- UPDATE 2 ---
Die Fehler des Git-Clients funktionieren in den meisten Fällen. Selbst wenn Sie nur Windows-Clients, Linux-Clients oder beides haben. Diese sind:
core.autocrlf=true
bedeutet, dass beim Auschecken Zeilen in CRLF und beim Hinzufügen von Dateien in LF konvertiert werden.core.autocrlf=input
bedeutet, dass beim Auschecken keine Zeilen konvertiert werden müssen (dies ist nicht erforderlich, da erwartet wird, dass Dateien mit LF festgeschrieben werden) und beim Hinzufügen von Dateien keine Zeilen in LF konvertiert werden (falls erforderlich). ( - update3 - : Scheint, dass diesfalse
standardmäßig ist, aber es ist wieder in Ordnung)Die Eigenschaft kann in verschiedenen Bereichen festgelegt werden. Ich würde vorschlagen, den Bereich explizit
--global
festzulegen, um einige am Ende beschriebene IDE-Probleme zu vermeiden.Außerdem würde ich dringend davon abraten , Windows zu verwenden
git config --global core.autocrlf false
(falls Sie nur Windows-Clients haben), im Gegensatz zu dem, was für die Git-Dokumentation vorgeschlagen wird . Wenn Sie auf false setzen, werden Dateien mit CRLF im Repo festgeschrieben. Aber es gibt wirklich keinen Grund. Sie wissen nie, ob Sie das Projekt für Linux-Benutzer freigeben müssen. Außerdem ist dies ein zusätzlicher Schritt für jeden Client, der dem Projekt beitritt, anstatt Standardeinstellungen zu verwenden.Nun können Sie für einige Sonderfälle von Dateien (z. B.
*.bat
*.sh
), die mit LF oder CRLF ausgecheckt werden sollen, diese verwenden.gitattributes
Zusammenfassend ist für mich die beste Vorgehensweise :
git grep -I --files-with-matches --perl-regexp '\r' HEAD
( Hinweis: Auf Windows-Clients funktioniert dies nur übergit-bash
und auf Linux-Clients, wenn es mit--with-libpcre
in kompiliert wurde../configure
)core.autocrlf=input
( --- Update 3 - ).gitattributes
core.autocrlf
oben beschriebenen Werte auf die Standardwerte zu setzen..gitattributes
. Git-Clients von IDEs können sie ignorieren oder unterschiedlich behandeln.Wie gesagt, einige Dinge können in Git-Attributen hinzugefügt werden:
Ich denke, einige andere sichere Optionen für
.gitattributes
anstelle der automatischen Erkennung für Binärdateien:-text
(zB für*.zip
oder*.jpg
Dateien: Wird nicht als Text behandelt. Daher werden keine Konvertierungen am Zeilenende versucht. Diff ist möglicherweise durch Konvertierungsprogramme möglich.)text !eol
(zB für*.java
,*.html
: Wird als Text behandelt, aber die Präferenz für den EOL-Stil ist nicht festgelegt. Daher wird die Client-Einstellung verwendet.)-text -diff -merge
(zB für*.hugefile
: Nicht als Text behandelt. Kein Diff / Merge möglich)--- VORHERIGES UPDATE ---
Ein schmerzhaftes Beispiel für einen Client, der Dateien falsch festschreibt:
Netbeans 8.2 (Windows), wird fälschlicherweise alle Textdateien mit Commit CRLFs, es sei denn , Sie haben ausdrücklich festgelegt ,
core.autocrlf
wie global . Dies widerspricht dem Standardverhalten des Git-Clients und verursacht später beim Aktualisieren / Zusammenführen viele Probleme. Dies führt dazu, dass einige Dateien auch beim Zurücksetzen anders aussehen (obwohl dies nicht der Fall ist) .Das gleiche Verhalten in Netbeans tritt auch dann auf, wenn Sie
.gitattributes
Ihrem Projekt korrekt hinzugefügt haben .Wenn Sie nach einem Commit den folgenden Befehl verwenden, können Sie zumindest frühzeitig erkennen, ob in Ihrem Git-Repo Probleme mit dem Zeilenende auftreten:
git grep -I --files-with-matches --perl-regexp '\r' HEAD
Ich habe Stunden damit verbracht, die bestmögliche Nutzung zu finden.gitattributes
, um endlich zu erkennen, dass ich mich nicht darauf verlassen kann.Leider besteht
.gitattributes
die sichere Lösung darin, LF überall zu erzwingen, selbst auf Editorebene, solange es JGit-basierte Editoren gibt (die nicht richtig handhaben können).Verwenden Sie die folgenden
anti-CRLF
Desinfektionsmittel.Windows / Linux-Clients:
core.autocrlf=input
engagiert
.gitattributes
:* text=auto eol=lf
Commit
.editorconfig
( http://editorconfig.org/ ), ein standardisiertes Format, kombiniert mit Editor-Plugins:https://github.com/welovecoding/editorconfig-netbeans/quelle
.gitattributes
Linie, sie hat unbeabsichtigte Konsequenzen in Git <2.10, siehe stackoverflow.com/a/29508751/2261442git config --global core.autocrlf false
Verdammt noch mal ... Ich habe unzählige Antworten, die ich befürworte und empfehle, mich nur in.gitattributes
Richtlinien mit EOL zu befassen .Dies ist nur eine Problemumgehungslösung :
Verwenden Sie im Normalfall die Lösungen, die mit git geliefert werden. Diese funktionieren in den meisten Fällen hervorragend. Auf LF erzwingen, wenn Sie die Entwicklung auf Windows- und Unix-basierten Systemen durch Festlegen von .gitattributes freigeben .
In meinem Fall haben> 10 Programmierer ein Projekt unter Windows entwickelt. Dieses Projekt wurde bei CRLF eingecheckt und es gab keine Option, LF zu erzwingen.
Einige Einstellungen wurden intern auf meinem Computer geschrieben, ohne das LF-Format zu beeinflussen. Daher wurden einige Dateien bei jeder kleinen Dateiänderung global in LF geändert.
Meine Lösung:
Windows-Maschinen: Lassen Sie alles so wie es ist. Kümmere dich um nichts, da du ein Standardentwickler von Windows 'Lone Wolf' bist und so vorgehen musst: "Es gibt kein anderes System auf der ganzen Welt, oder?"
Unix-Maschinen
Fügen Sie dem
[alias]
Abschnitt einer Konfiguration die folgenden Zeilen hinzu . Dieser Befehl listet alle geänderten (dh geänderten / neuen) Dateien auf:Konvertieren Sie alle geänderten Dateien in das Dos-Format:
Optional ...
Erstellen Sie einen Git- Hook für diese Aktion, um diesen Prozess zu automatisieren
Verwenden Sie params und schließen Sie sie ein und ändern Sie die
grep
Funktion so, dass sie nur bestimmten Dateinamen entspricht, z.Fühlen Sie sich frei, es noch bequemer zu machen, indem Sie eine zusätzliche Verknüpfung verwenden:
... und feuere das konvertierte Zeug durch Tippen ab
quelle