Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

git config merge.renameLimit 999999

а затем:

git config --unset merge.renameLimit

Ответ 2

Сообщение в блоге " Confluence, git, переименовать, слить oh my..." добавляет интересную информацию, которая иллюстрирует Robie answer (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 отлично подходит для обнаружения переименования.

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