2012-04-18 9 views
5

Ok, hier geht mein Q. Vergleicht "git rerere" Hashes zweier Dateien, um die Auflösung herauszufinden? Das heißt, ich sage eine XML-Datei, die dieses Tag enthält:Wie findet Git rerere die Ähnlichkeiten zwischen zwei Konflikten?

<number>12</number> 

Wenn ich einen Konflikt haben, wird diese Zahl in der Regel so etwas wie 13 geändert wird, 14, usw., also bin ich fest mit:

Kann den Konflikt automatisch auflösen, auch wenn die Nummern nicht die gleichen wie beim letzten Mal sind? Ich möchte immer, dass es so aufgelöst wird, dass es die höhere Zahl braucht (im Beispiel oben, 13). Wenn es also die Auflösung für die Nummern 12 und 13 aufzeichnet, löst es dann Konflikte mit anderen Zahlen? Ich habe einen Verdacht, wird es nicht, aber könnte genauso gut fragen.

Antwort

7

Kann den Konflikt automatisch auflösen, auch wenn die Nummern nicht die gleichen wie beim letzten Mal sind? Ich möchte immer, dass es so aufgelöst wird, dass es die höhere Zahl braucht (im Beispiel oben, 13).

Nein, git rerere kann das nicht tun.

Wenn Sie git rerere, Sie fragen es zwei Dinge zu erinnern:

  • ein spezifischer Konflikt (das heißt, der wörtliche Text der großen Stücke, die in Konflikt und die Dateien sind, dass sie in); und
  • die Auflösung, die für diesen Konflikt angewandt werden sollte

Da diese HUNK Literale (zB „ersetzen 12 mit 13“) als eine Art von Transformationsfunktion (zB „ersetzen N mit N + 1 "), kann Git nicht schließen, dass Sie jede Zahl durch eine höhere ersetzen möchten.

Wenn git später auf einen Konflikt stößt, der keinem seiner zuvor gespeicherten Konflikte entspricht, ist es so, als ob dieser Konflikt überhaupt nicht auftritt, selbst wenn er ähnlich sein sollte (wie in Ihrem Beispiel, wo die Zahlen immer sind) eins davon).

Ein Ausweg ist möglich, wenn diese XML-Datei automatisch generiert wird. In diesem Fall sollten Sie in Erwägung ziehen, das Steuerelement nicht in der Quellcodeverwaltung zu belassen und es stattdessen zur Laufzeit zu generieren. Dann werden Sie nie die entsprechenden Konflikte haben, um aufzuräumen.

Ein anderer Ansatz besteht darin, git rerere insgesamt zu vermeiden und stattdessen einen benutzerdefinierten Zusammenführungstreiber zu schreiben, der die Probleme für Sie löst. Ich habe das schon einmal gemacht, aber es ist eine nicht unerhebliche Menge an Arbeit, und Sie müssen etwas Code schreiben und testen. Wenn Sie an dieser Strategie interessiert sind, finden Sie unter the link in Karl's answer.

+0

Ah, dachte so. Vielen Dank für eine ausführliche Antwort.Leider werden diese Zahlen immer von Menschen eingegeben, so dass es aussieht, als würde ich mir diesen benutzerdefinierten Merge-Treiber ansehen. Danke für den Tipp, du und Karl. – mart1n

2

Vanilla Git vergleicht Dateien nicht auf diese Weise. Es führt einen strikten Stringvergleich durch und weiß nichts über dessen Semantik.

Schauen Sie sich jedoch unter "gitattributes man page" einen "benutzerdefinierten Merge-Treiber definieren" an. Sie können Ihr eigenes Programm schreiben, um bestimmte Zusammenführungen beliebig zu lösen, einschließlich der höheren Nummer.