Как объединить две ветви с разными иерархиями каталогов в git? - PullRequest
57 голосов
/ 18 января 2011

Я начал использовать Maven с проектом веб-приложения, поэтому иерархия каталогов изменилась.Я создал новую ветку для интеграции Maven.Теперь у меня есть две ветви: одна со старой иерархией каталогов и одна с иерархией папок maven.Обе ветви имеют новые коммиты (исправления и новые функции).

Я хотел бы избавиться от старой ветви и объединить ее изменения с веткой Maven.Git Merge дает бесчисленные конфликты, которые кажутся невозможными для разрешения.Я считаю, что это потому, что пути к файлам изменились.

Каков наилучший способ приблизиться к этому слиянию?

Ответы [ 2 ]

138 голосов
/ 18 января 2011

Попробуйте установить merge.renameLimit на что-то высокое для этого слияния. git пытается обнаружить переименования, но только если количество файлов ниже этого предела, так как для этого требуется время обработки O (n ^ 2):

git config merge.renameLimit 999999

затем, когда закончите:

git config --unset merge.renameLimit
24 голосов
/ 29 октября 2012

В блоге " Слияние, мерзавец, переименование, слияние, о мой ... " добавлена ​​интересная информация, которая иллюстрирует Роби * ответ (upvoted):

При попытке обнаружить переименования git различает точное и неточное переименование с помощью:

  • первый - переименование без изменения содержимого файла и
  • последнее - переименование, которое может включать изменения в содержимом файла (например, переименование / перемещение класса Java).

Это различие важно, потому что алгоритм обнаружения точных переименований является линейным и всегда будет выполняться, пока алгоритм неточного обнаружения переименования является квадратичным (O(n^2)), и git не пытается сделать это, если количество измененных файлов превышает определенный порог (по умолчанию 1000).

Если явно не установлено, merge.renameLimit по умолчанию равно 1000 файлам или использует значение для diff.renameLimit, если установлено.
diff.renameLimit влияет на git diff, git show и git log, тогда как merge.renameLimit применяется только к попыткам слияния (git merge, git cherry-pick).

Рекомендуется изменить merge.renameLimit вместо изменения diff.renameLimit, чтобы git не пытался найти переименования во время обычных операций, таких как просмотр вывода git diff.

Для отображения переименований можно использовать такие команды, как git show или git log, с параметром -M, который включает обнаружение переименования.

Линус упоминает :

Да, для ядра у меня есть

    [diff]
            renamelimit=0

чтобы полностью отключить ограничение, потому что ограничение по умолчанию очень низкое. Git довольно хорош в обнаружении переименования.

Однако причина низкого значения по умолчанию не в том, что он недостаточно быстр, а в том, что он может в конечном итоге использовать много памяти (и если у вас мало памяти, подкачка будет означать, что она идет из «довольно snappy "to" slow как меласса "- но процессор все равно не будет ограничен, это просто пейджинг как сумасшедший)

...