Jak połączyć dwie gałęzie z różnymi hierarchiami katalogów w git?

Zacząłem używać Mavena z projektem aplikacji webowej, więc hierarchia katalogów się zmieniła. Stworzyłem nową gałąź dla Maven integration. Teraz mam dwie gałęzie jeden ze starą hierarchią katalogów i jeden z hierarchią katalogów Maven. Obie gałęzie mają nowe commity (poprawki błędów i nowe funkcje).

Chciałbym pozbyć się starej gałęzi i połączyć jej zmiany z gałęzią Mavena. Git merge daje niezliczone konflikty, które wydają się niemożliwe do rozwiązania. I believe że dzieje się tak dlatego, że ścieżki plików uległy zmianie.

Jaki jest najlepszy sposób na połączenie?

Author: Sylvain Defresne, 2011-01-18

2 answers

Spróbuj ustawić merge.renameLimit na coś wysokiego dla tego połączenia. git próbuje wykryć zmianę nazw, ale tylko wtedy, gdy liczba plików jest poniżej tego limitu, ponieważ wymaga czasu przetwarzania O (N^2):

git config merge.renameLimit 999999

Wtedy gdy zrobi się:

git config --unset merge.renameLimit
 127
Author: Robie Basak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-01-18 09:53:40

Wpis na blogu " Confluence, Git, rename, merge oh my ... " dodaje kilka ciekawych informacji, które ilustrują Robie 'Sodpowiedź (upvoted):

Podczas próby wykrycia zmiany nazw git rozróżnia exact i inexact zmienia nazwy Z:

  • Pierwsza to zmiana nazwy bez zmiany zawartości pliku i
  • ta ostatnia zmiana nazwy, która może zawierać zmiany w zawartości pliku (np. zmiana nazwy / przenoszenie klasy Java).

To rozróżnienie jest ważne, ponieważ algorytm wykrywania dokładnych zmian nazw jest liniowy i zawsze będzie wykonywany, podczas gdy algorytm wykrywania niedokładnych zmian nazw jest kwadratowy (O(n^2)) i git nie próbuje tego robić, jeśli liczba zmienionych plików przekroczy określony próg (domyślnie 1000).

Gdy nie jest jawnie ustawione, merge.renameLimit domyślnie zawiera 1000 plików lub używa wartości diff.renameLimit jeśli jest ustawione.
diff.renameLimit wpływa git diff, git show i git log podczas gdy merge.renameLimit stosuje się do prób łączenia(git merge, git cherry-pick) tylko.

Dobrym pomysłem jest zmiana merge.renameLimit w przeciwieństwie do zmiany diff.renameLimit tak, aby git nie próbował znaleźć zmian nazw podczas typowych operacji, takich jak patrzenie na wyjście git diff.

Aby pokazać zmianę nazw, polecenia takie jak git show lub git log mogą być używane z opcją -M, która włącza wykrywanie zmiany nazw.

Linus wspomina :

Tak, dla jądra, I mieć

    [diff]
            renamelimit=0

Aby całkowicie wyłączyć limit, ponieważ domyślny limit jest naprawdę bardzo niski. Git jest całkiem dobry w wykrywaniu zmiany nazwy.

Jednak powodem niskiej domyślnej nie jest to, że nie jest wystarczająco Żwawy - to dlatego, że może skończyć się przy użyciu dużo pamięci (a jeśli masz mało pamięci, Zamiana będzie oznaczać, że przechodzi z "dość Żwawy" do "powolny jak melasa" - ale nadal nie będzie ograniczona CPU, to po prostu stronicowanie jak szalony).

 23
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:34:23