Ist es möglich git merge
, Unterschiede am Zeilenende zu ignorieren?
Vielleicht stelle ich die falsche Frage ... aber:
Ich habe versucht , uisng config.crlf input
aber die Dinge bekamen ein bisschen chaotisch und außer Kontrolle geraten , besonders wenn ich wandte sie nach der Tat .
Zum einen scheint das Anwenden dieser Konfiguration nachträglich keine Auswirkungen auf Dateien zu haben, die vor dem Anwenden dieser Option in das Repository übernommen wurden. Eine andere Sache ist, dass plötzlich alle Commits zu vielen nervigen Warnmeldungen über die Konvertierung von CRLF in LF führen.
Um ehrlich zu sein, ist es mir egal, welches Zeilenende verwendet wird, ich persönlich bevorzuge den Unix-Stil \n
, aber was auch immer. Alles, was mich interessiert, ist git merge
, ein bisschen schlauer zu sein und die Unterschiede in den Zeilenenden zu ignorieren.
Manchmal habe ich zwei identische Dateien, aber git markiert sie als Konflikt (und der Konflikt ist die gesamte Datei), einfach weil sie ein anderes Zeilenendezeichen verwenden.
Aktualisieren:
Ich habe herausgefunden, dass git diff
eine --ignore-space-at-eol
Option akzeptiert wird. Wäre es möglich, git merge
diese Option auch verwenden zu lassen?
git config merge.renormalize true
Antworten:
Update 2013:
Neuere git Versionen mit merge mit Strategie autorisieren
recursive
und Strategie - Option (-X
):Die Verwendung von "
-Xignore-space-change
" ist aber auch möglichjakub.g auch kommentiert , dass die Strategien arbeiten auch mit Rosinenpickerei :
Das funktioniert viel besser als
ignore-all-space
.Ursprüngliche Antwort (Mai 2009)
Der Patch zum Ignorieren des EOL-Stils wurde im Juni 2007 vorgeschlagen , betrifft jedoch nur
git diff --ignore-space-at-eol
, nichtgit merge
.Zu diesem Zeitpunkt wurde die Frage gestellt:
Julio C Hamano war nicht gerade begeistert:
Die allgemeine Idee
git merge
besteht darin, sich auf das Merge-Tool eines Drittanbieters zu verlassen.Zum Beispiel habe ich DiffMerge als Tool für Git-Merge eingerichtet und einen Regelsatz festgelegt, mit dem dieses Merge-Tool eol für bestimmte Dateitypen ignorieren kann.
Setup unter Windows mit MSysGit1.6.3, entweder für DOS- oder Git-Bash-Sitzungen, mit DiffMerge oder KDiff3:
c:\HOMEWARE\cmd
.merge.sh:
Git-Konfigurationsbefehle:
Git-Konfiguration auf Systemebene:
DOS-Skript (Hinweis: Der Befehl dos2unix stammt von hier und wird zur Simulation eines Unix-EOL-Stils verwendet. Dieser Befehl wurde in das am Anfang dieser Antwort angegebene Verzeichnis kopiert.):
C:\HOMEWARE\git\test>mkdir test_merge C:\HOMEWARE\git\test>cd test_merge C:\HOMEWARE\git\test\test_merge>git init C:\HOMEWARE\git\test\test_merge>echo a1 > a.txt & echo a2 >> a.txt C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "a.txt, windows eol style" C:\HOMEWARE\git\test\test_merge>git checkout -b windows Switched to a new branch 'windows' C:\HOMEWARE\git\test\test_merge>echo a3 >> a.txt & echo a4 >> a.txt C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "add two lines, windows eol style" C:\HOMEWARE\git\test\test_merge>git checkout master C:\HOMEWARE\git\test\test_merge>git checkout -b unix Switched to a new branch 'unix' C:\HOMEWARE\git\test\test_merge>echo au3 >> a.txt & echo au4 >> a.txt && echo au5 >> a.txt C:\HOMEWARE\git\test\test_merge>dos2unix a.txt Dos2Unix: Processing file a.txt ... C:\HOMEWARE\git\test\test_merge>git add a.txt C:\HOMEWARE\git\test\test_merge>git commit -m "add 3 lines, all file unix eol style" [unix c433a63] add 3 lines, all file unix eol style C:\HOMEWARE\git\test\test_merge>git merge windows Auto-merging a.txt CONFLICT (content): Merge conflict in a.txt Automatic merge failed; fix conflicts and then commit the result. C:\HOMEWARE\git\test\test_merge>git ls-files -u 100644 39b4c894078a02afb9b1dfeda6f1127c138e38df 1 a.txt 100644 28b3d018872c08b0696764118b76dd3d0b448fca 2 a.txt 100644 3994da66530b4df80189bb198dcfac9b8f2a7b33 3 a.txt C:\HOMEWARE\git\test\test_merge>git mergetool Merging the files: a.txt Normal merge conflict for 'a.txt': {local}: modified {remote}: modified Hit return to start merge resolution tool (diffmerge):
An diesem Punkt (durch Drücken von "Return") wird DiffMerge oder KDiff3 geöffnet, und Sie werden selbst sehen, welche Zeilen tatsächlich zusammengeführt und welche Zeilen ignoriert werden.
Warnung : Die Ergebnisdatei befindet sich mit DiffMerge immer im Windows-EOL-Modus (CRLF).
KDiff3 bietet das Speichern auf die eine oder andere Weise an.
quelle
git cherry-pick abcd123456 --strategy=recursive --strategy-option=renormalize
(das funktioniert viel besser alsignore-all-space
)Ich suchte nach der gleichen Antwort und fand dies heraus
Das Ausführen dieses Befehls in einem beliebigen Repository reicht also aus:
quelle
Nach dem Lesen von https://stackoverflow.com/a/12194759/1441706 und https://stackoverflow.com/a/14195253/1441706
Für mich hat dieser Befehl den Trick perfekt gemacht:
quelle
Wie in dieser Antwort: https://stackoverflow.com/a/5262473/943928
Du könntest es versuchen:
git merge -s recursive -Xignore-space-at-eol
quelle
Was ich getan habe, war, alles als Standard zu belassen (dh autocrlf = true), alle Dateien zu berühren (find. -Exec touch {} \;), git sie als 'modifiziert' ansehen zu lassen und sie zurückzuschreiben und damit fertig zu sein. Andernfalls werden Sie entweder immer von nervigen Nachrichten oder überraschenden Unterschieden geplagt oder müssen alle Whitespace-Funktionen von git deaktivieren.
Sie verlieren Schuldinformationen, aber es ist besser, dies eher früher als später zu tun :)
quelle
"git merge -Xrenormalize" funktioniert wie ein Zauber.
quelle
Es sieht nicht so aus, als ob dies direkt möglich wäre, aber dieser Beitrag schlägt eine Umgehung vor.
http://osdir.com/ml/git/2009-02/msg02532.html
quelle
http://stahlforce.com/dev/index.php?tool=remcrlf
Ich habe es versucht, aber wenn Sie nach der letzten Zeile in Ihrem Code noch keine CRLF hatten, fügt es selbst eine LF hinzu und die Datei sieht in git geändert aus. Davon abgesehen funktioniert es.
quelle
Es scheint mir jetzt, dass der beste Weg darin besteht, die Zeilenenden in beiden Zweigen zu normalisieren (und festzuschreiben), bevor sie zusammengeführt werden.
Ich googelte "crlf in lf konvertieren" und fand dies als erstes Ergebnis:
http://stahlforce.com/dev/index.php?tool=remcrlf
Ich habe es heruntergeladen und verwendet, scheint ein schönes Werkzeug zu sein.
Stellen Sie jedoch sicher, dass Sie ein Verzeichnis und einen Dateityp (z. B. .py) angeben, da sonst versucht wird, den Inhalt des
.git
Verzeichnisses zu verfälschen !quelle
AFAICT (ich habe es nicht ausprobiert) Sie können
git diff
den Zweig, den Sie zusammenführen möchten, mit dem gemeinsamen Vorfahren vergleichen und dann die Ergebnisse mit anwendengit apply
. Beide Befehle--ignore-whitespace
bieten Optionen zum Ignorieren von Zeilenenden und Leerzeichenfehlern.Wenn der Patch nicht sauber angewendet wird, wird der gesamte Vorgang leider abgebrochen. Sie können Zusammenführungskonflikte nicht beheben. Es gibt eine
--reject
Option, nicht stapelbare Hunks in.rej
Dateien zu belassen. Dies ist hilfreich , entspricht jedoch nicht den in einer Datei angezeigten Zusammenführungskonflikten.quelle
Nach dem Lesen Zusammenführen von Zusammenführungskonflikten: Erzwingen Sie das Überschreiben aller Dateien
Ich habe endlich meine Version dieses Problems behoben. Ich habe versucht, Updates aus dem Upstream-Repo abzurufen, aber mein aktuelles Repo hatte CRLF-Probleme und konnte als Ergebnis nicht zusammengeführt werden. Es sollte beachtet werden, dass ich KEINE LOKALEN ÄNDERUNGEN hatte, über die ich mir Sorgen machen musste. Die folgenden Schritte haben mein Problem behoben:
Gemäß den Anweisungen von github zum Synchronisieren von Gabeln ( https://help.github.com/articles/syncing-a-fork/ ):
git fetch upstream
git reset --hard upstream/master
Mein begrenztes Verständnis von Git sagt mir, dass dies das tut, was ich will - meine Gabel neu zu gründen (ohne tatsächlich nicht festgeschriebene Änderungen), um alle Änderungen zu erhalten, die an der Upstream-Quelle vorgenommen wurden. Laut der Quellseite sollte dieser Schritt normalerweise nicht erforderlich sein, aber das CRLF-Problem machte ihn erforderlich.
git merge upstream/master
git push
quelle
git reset --hard upstream/master
Ihre lokale Niederlassung weggeworfen und darauf hingewiesen wirdupstream/master
, wasgit merge upstream/master
ein No-Op macht?Ich empfehle jedoch, ein Tool wie sed zu verwenden, um korrekte Zeilenenden zu erzielen, und dann Dateien zu diff. Ich verbrachte paar Stunden auf die Differenzen zwischen Projekten mit verschiedenen Zeilenenden.
Der beste Weg war:
.git
Verzeichnis weglassen ) in ein anderes Verzeichnis, erstellen Sie ein Repository darin, fügen Sie dann Dateien hinzu und schreiben Sie sie fest (sollte sich im Hauptzweig des neuen Repositorys befinden).dev
(git checkout -b dev
), schreiben Sie Dateien in diesen Zweig und führen Sie sie aus (wenn sich das erste Projekt im Master befindet)git diff master..dev --names-only
, um nur die Namen der geänderten Dateien anzuzeigenquelle