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

Слияние изменений поддерева - фатальный: недопустимый путь 'somefile_BASE_20704.cs'

У меня есть три репозиции - имена изменены для ясности:

SharedStuff, ProjectA и ProjectB

Оба проекта используют git -subtree для сохранения локальной копии SharedStuff. Они оба внесли локальные изменения, которые я пытаюсь объединить централизованно, тестировать, а затем снова сливаться с каждым.

Я запустил это в репозитории ProjectA:

git subtree split --prefix=SharedStuff -b SharedStuff_from_ProjectA --rejoin

... затем перетащил его в репозиторий SharedStuff, разрешил несколько простых конфликтов, объединил его.

Теперь я запустил это в репозитории ProjectB:

git subtree split --prefix=platform/SharedStuff -b SharedStuff_from_Project_B --rejoin

... и снова нажал на SharedStuff repo в новой ветке. Проблема возникает, когда я пытаюсь объединить эти изменения.

В текущем случае я переключаюсь на ветвь SharedStuff_from_Project_B, затем git merge master - но сразу получаю все измененные файлы, перечисленные как конфликты добавить/добавить. Когда я запускаю git mergetool, каждый из них имеет такую ​​ошибку:

Merging:
somefile.xyz

Normal merge conflict for 'somefile.xyz':
  {local}: created file
  {remote}: created file
fatal: invalid path './somefile.xyz_BASE_20704.cs'

(Конечно, если я попробую наоборот - объединить SharedStuff_from_Project_B в master - я получаю одни и те же конфликты, просто обратный. Еще добавьте/добавьте).

Я предполагаю, что что-то может быть неправильным в истории ProjectB, вызывая появление add/add. Я не уверен, как дальше диагностировать это, хотя - что я могу сделать?

Изменить: в ProjectB было добавлено предыдущее поддерево "rejoin" commit, но изменения в нем не были объединены в SharedStuff. Но при повторном запуске git subtree split с --ignore-joins возникает одна и та же проблема - много конфликтов слияния add/add, несмотря на историю этой ветки разделяющего поддерева, возвращающейся обратно, когда SharedStuff был сначала помещен в ProjectB.: (

Изменить: также git merge-base между разделенным поддеревом от ProjectB и master на SharedStuff не дает никаких результатов. Я не уверен, как это произошло или как решить?

4b9b3361

Ответ 1

Я не знаю, что вызвало это. Однако вот как я это разрешил - вроде как. Мне все еще нужны лучшие ответы!

Обе "общие" ветки фактического мастера на SharedStuff, а разделенная копия из ProjectB имела то же самое в своей отдаленной истории - ну, те же самые изменения с теми же самыми tree SHA внутри, но различные фиксированные SHA. Это связано с тем, что ветвь ProjectB имела, по крайней мере, первую начальную фиксацию, отличную от SharedStuff.

Пока в истории не было общих коммитов (с теми же самыми SHA), слияние, перезагрузка и т.д. не смогут найти общий язык и предполагают, что файлы были добавлены в обеих историях.

Решение: найдите две ранние фиксации в истории с тем же tree SHA (т.е. точно таким же содержимым файла) и зафиксируйте информацию - сообщение, автора и т.д. - и вручную перепишите родителя этого коммита в ProjectB разделить ветвь на родительский объект в SharedStuff master.

Я сделал это с помощью трансплантата: Установка родительского указателя git для другого родителя

  • Напишите новую строку .git/info/grafts, в основном wrong-parent right-parent
  • Переключиться на ветку - обнаружить PowerShell echo использовать 16-битный формат символа, перезаписать с помощью Sublime Text и снова переключиться;)
  • Запустите git filter-branch right-parent..HEAD на ветке, чтобы запечатать сделку.
  • Проверить все слияние

Следующая интересная задача - увидеть, как эта версия сливается обратно в ProjectB; будет обновляться, когда это будет сделано.

Я бы все же действительно приветствовал реальный ответ на этот вопрос - это действительно взломано!