9 Stimmen

Leerzeichen beim Zusammenführen in Mercurial ignorieren

Wir stoßen beim Zusammenführen in Mercurial auf ein Problem, bei dem Änderungen mit Leerzeichen zu Konflikten beim Zusammenführen führen, die alle "echten" Konflikte verdecken und das Zusammenführen zu einem Albtraum machen. Wir haben vor kurzem einen neuen Formatierungsstil eingeführt, der die Einrückung der Dateien in einigen Zweigen verändert hat, und seitdem ist das Zusammenführen fast unmöglich geworden.

Versuchen Sie es zum Beispiel:

hg init testrepo
cd testrepo/

echo "This is text." > newfile.txt
hg add newfile.txt
hg commit -m "Created a file."
hg branch newbranch
echo "This is some more text." > newfile.txt
hg commit -m "Changed text in the file."
hg update default
echo "   This is text." > newfile.txt
hg commit -m "Added indentation whitespace."

Daraus ergeben sich zwei Zweige, einer mit Leerzeichenänderungen, der andere mit Textänderungen:

@  2     "   This is text".
|    
|
| o  1   "This is some more text."
|/     
|
o  0     "This is text."

Beim Versuch einer hg merge erhalte ich einen Konflikt bei der Zusammenführung. Wenn wir in jeder Zeile Konflikte haben, wird es schwierig und zeitraubend, die "echten" Konflikte auszusortieren. Ich würde es vorziehen, wenn der Zusammenführungsprozess denken würde: "OK, Änderungssatz 2, Zeile 1 unterscheidet sich nur durch Leerzeichen vom übergeordneten Satz, also wird er als unverändert betrachtet. Wähle Änderungssatz 1, Zeile 1 als das zusammengefasste Ergebnis".

0 Stimmen

@SyntaxT3rr0r: Danke für den Hinweis - ich war mir der Go-Lang nicht bewusst und habe sie mit Interesse gelesen. Wie eine Art Python / Java-Hybrid.

0 Stimmen

11voto

Ry4an Brase Punkte 77642

Ob Leerzeichen ignoriert werden oder nicht, ist eine Entscheidung, die Ihr Merge-Tool trifft. Sie können alle Arten von Merge-Tools für die Verwendung mit Mercurial konfigurieren, wie hier gezeigt: MergeToolConfiguration

Mercurial's interner Pre-Merge wird/kann keine Leerzeichen ignorieren, aber wenn Ihr externes Merge-Tool dies tut und es nur Leerzeichenänderungen findet, wird es sofort beendet, und wenn es andere als Leerzeichenänderungen findet, kann es die Leerzeichenänderungen ausblenden, wenn es geladen wird.

Zum Beispiel mit dem beliebten kdiff3-Zusammenführungswerkzeug aktivieren Sie die Einstellung "Weißer Raum 2/3-Dateien zusammenführen" und teilen Sie dem Programm mit, ob es links oder rechts wählen soll.

Tl;Dr: Schalten Sie dies in Ihrem Merge-Tool ein, nicht in Mercurial.

0voto

Mikecito Punkte 2091

Ist dies eine Situation, in der es schwierig wäre, die Leerzeichen zu bereinigen? Wenn nicht, würde ich ein einfaches Skript schreiben, das alle Leerzeichen vor dem Einchecken entfernt, um dies zu vermeiden. Der Nachteil ist, dass Sie die Formatierung verlieren würden, aber die meisten IDEs können das leicht wiederherstellen.

Die Alternative wäre, vor dem Einchecken einen Standardformatierer zu verwenden, der das Gegenteil tut: Er fügt Leerraum ein, wo er sein sollte.

0 Stimmen

Wir haben einen Formatierer, der die Datei vor dem Einchecken formatiert. Das Problem trat auf, als sich unsere Konventionen für die Einrückung und die Verwendung von Leerzeichen/Tabulatoren änderten. Die Dateien wurden mit den neuen Konventionen übertragen und Zusammenführungen zwischen Zweigen wurden durchgeführt, was zu einem großen Durcheinander führte. Schließlich ließen wir den Formatierer für alle Dateien in allen Zweigen laufen, aber jetzt haben wir dieses Leerzeichenproblem, wenn wir versuchen, sie zusammenzuführen. Da es viele Dateien gibt, wollten wir die Zusammenführung so weit wie möglich automatisieren. Sobald die Zusammenführung abgeschlossen ist und der gesamte Verlauf das neue Format enthält, wird alles wieder in Ordnung sein.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X