Wie füge ich zwei Zweige mit unterschiedlichen Verzeichnishierarchien in Git zusammen?

77

Ich habe angefangen, Maven mit einem Webanwendungsprojekt zu verwenden, daher hat sich die Verzeichnishierarchie geändert. Ich habe einen neuen Zweig für die Maven-Integration erstellt. Jetzt habe ich zwei Zweige, einen mit der alten Verzeichnishierarchie und einen mit der Maven-Verzeichnishierarchie. Beide Zweige haben neue Commits (Bugfixes und neue Funktionen).

Ich möchte den alten Zweig loswerden und seine Änderungen mit dem Maven-Zweig zusammenführen. Git Merge führt zu unzähligen Konflikten, die sich unmöglich lösen lassen. Ich glaube, das liegt daran, dass sich die Dateipfade geändert haben.

Was ist der beste Weg, um diese Fusion anzugehen?

Anssien
quelle
10
Nur damit andere Leser wissen: Die typische Fehlermeldung für diese Probleme ist too many files skipping inexact rename detection.
Nils Werner

Antworten:

165

Versuchen Sie merge.renameLimit, für diese Zusammenführung einen hohen Wert festzulegen. git versucht, Umbenennungen zu erkennen, jedoch nur, wenn die Anzahl der Dateien unter dieser Grenze liegt, da O (n ^ 2) Verarbeitungszeit erforderlich ist:

git config merge.renameLimit 999999

dann, wenn fertig:

git config --unset merge.renameLimit
Robie Basak
quelle
8
Beachten Sie, dass ich nach dem Erhöhen von renameLimit "git merge --abort" ausführen musste, damit ich den Pull erneut versuchen konnte. Ansonsten hat dies den Trick getan.
Leontx
27

Der Blog - Eintrag " Confluence, git, Umbenennungs, merge oh mein ... " , fügt einige interessante Informationen , die zeigt , Robie ‚s Antwort (upvoted):

Beim Versuch, Umbenennungen zu erkennen, unterscheidet git zwischen exakten und ungenauen Umbenennungen mit:

  • Ersteres ist eine Umbenennung, ohne den Inhalt der Datei zu ändern, und
  • Letzteres ist eine Umbenennung, die Änderungen am Inhalt der Datei enthalten kann (z. B. Umbenennen / Verschieben einer Java-Klasse).

Diese Unterscheidung ist wichtig, da der Algorithmus zum Erkennen exakter Umbenennungen linear ist und immer ausgeführt wird, während der Algorithmus zum Erkennen ungenauer Umbenennungen quadratisch ist ( O(n^2)) und git dies nicht versucht, wenn die Anzahl der geänderten Dateien einen bestimmten Schwellenwert überschreitet (1000 mal) Standard).

Wenn nicht explizit festgelegt, werden merge.renameLimitstandardmäßig 1000 Dateien verwendet oder der Wert für diff.renameLimitif festgelegt.
Das diff.renameLimitwirkt sich git diff, git showund git logwährend merge.renameLimitgilt für merge Versuche ( git merge, git cherry-pick) nur.

Es ist eine gute Idee, das merge.renameLimitzu ändern diff.renameLimit, anstatt das zu ändern, damit git nicht versucht, bei allgemeinen Vorgängen wie dem Betrachten der git diffAusgabe Umbenennungen zu finden .

Um Umbenennungen anzuzeigen, können Befehle wie git showoder git logmit der -MOption verwendet werden, die die Umbenennungserkennung aktiviert.

Linus erwähnt :

Ja, für den Kernel habe ich

    [diff]
            renamelimit=0

das Limit vollständig zu deaktivieren, da das Standardlimit in der Tat sehr niedrig ist. Git ist ziemlich gut in der Umbenennungserkennung.

Der Grund für die niedrige Standardeinstellung liegt jedoch nicht darin, dass sie nicht schnell genug ist, sondern darin, dass sie möglicherweise viel Speicher verbraucht (und wenn Sie wenig Speicher haben, bedeutet das Austauschen, dass sie von "ziemlich schnell" auf "ziemlich schnell" wechselt "langsam wie Melasse" - aber es wird immer noch nicht CPU-begrenzt sein, es ist nur wie verrückt paging).

VonC
quelle