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?
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
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ścidiff.renameLimit
jeśli jest ustawione.diff.renameLimit
wpływagit diff
,git show
igit log
podczas gdymerge.renameLimit
stosuje się do prób łączenia(git merge
,git cherry-pick
) tylko.Dobrym pomysłem jest zmiana
merge.renameLimit
w przeciwieństwie do zmianydiff.renameLimit
tak, aby git nie próbował znaleźć zmian nazw podczas typowych operacji, takich jak patrzenie na wyjściegit diff
.Aby pokazać zmianę nazw, polecenia takie jak
git show
lubgit log
mogą być używane z opcją-M
, która włącza wykrywanie zmiany nazw.
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).
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