Как объединить две ветки с разными иерархиями каталогов в git?
Я начал использовать Maven с проектом веб-приложения, поэтому изменилась иерархия каталогов. Я создал новую ветку для интеграции Maven. Теперь у меня есть две ветки с старой иерархией каталогов и одна с иерархией каталогов maven. Обе ветки имеют новые коммиты (исправления и новые функции).
Я хотел бы избавиться от старой ветки и объединить ее в ветку Maven. Git merge дает бесчисленные конфликты, которые невозможно разрешить. Я считаю, что это связано с изменением путей к файлам.
Каков наилучший способ приблизиться к этому слиянию?
Ответы
Ответ 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 отлично подходит для обнаружения переименования.
Однако причина низкого значения по умолчанию заключается не в том, что он не достаточно умен, потому что он может в конечном итоге использовать много памяти (и если у вас мало памяти, то обмен будет означать, что он идет от "довольно мгновенно", чтобы "замедлить, как меласса" - но он все равно не будет ограниченным процессором, он просто пейджинговый как сумасшедший).