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

Миграция из git в Perforce

У меня есть задача переноса моей команды и источника из git в Perforce, и я ищу идеи о том, как переместить историю git в p4.

Я был бы счастлив, если бы перешел только мастер-ветвь. Однако это даже проблематично.

Я использую замечательный инструмент git -p4. Я создаю область назначения в моей рабочей области p4 и использую git p4 clone //depot/StuffFromGit, чтобы начать отслеживать ее в git -p4. Я перехватываю все мои репозитории git в клон git -p4. Тогда я могу git p4 submit и все изменения будут перенесены на p4.

Он отлично работает, когда история git выглядит так: nice и linear:

A---B---C---D

Проблема связана с несколькими людьми, работающими над проектом. Несмотря на то, что они работают над мастером, это все еще создает ветки, которые разделяют и объединяются. Тем не менее, git -p4 храбро справляется с этим:

A---B---C---E
     \--D--/

git p4 обходит OK, совершая ABCDE по порядку (или ABDCE, сначала историю людей).

Проблема возникает, когда, например, C и D меняют один и тот же файл, а E - слияние реального честного с хорошим. git p4 rebase здесь не работает; он будет перематывать коммиты, но во время воспроизведения он сначала применит C, затем попытается выполнить D и найти конфликт. Затем он остановится и попросит меня слиться. Ну, E содержит слияние, но он просит меня слить! 'git p4 submit' провалится аналогичным образом, только теперь p4 отклонит предварительное слияние.

Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging main.cpp
CONFLICT (content): Merge conflict in main.cpp
Failed to merge in the changes.
Patch failed at 0005 Changing main

Итак, теперь я застрял. Есть ли способ отладить историю git или получить git -p4, чтобы понять это? Это разочаровывает, поскольку существуют слияния.

Мысли, которые у меня были:

  • Используйте ветвь фильтра git, чтобы удалить все упоминания конфликтующих файлов. Я бы получил комментарии к истории, хотя и отсутствовал много изменений в файлах. Когда в истории было около 3000 записей, я бы удалил всю историю ключевых (занятых) файлов. В конце импорта отфильтрованных файлов я добавлю недостающие файлы, выполнив окончательную фиксацию HEAD.
  • Дампируйте историю, сделайте один p4-фиксацию HEAD (простой, но грустный).
  • Не переходите к p4: я проработал эту идею как можно дольше.

Ничего из того, что действительно здорово. Любые идеи о том, как git 'gt p4 rebase' или 'git p4 submit' работать?

4b9b3361

Ответ 1

Опция "просто выбросить старую историю" не так плоха, как кажется: вы можете просто сохранить репо на git вместе с ним навсегда, в случае, если кто-то должен прорыть старые вещи. К сожалению, просто невозможно представить сложный вид истории git в линейных системах старого стиля, таких как svn и p4.

Основная причина оглянуться на старую историю - это такие вещи, как "git аннотация" (я полагаю, что p4 имеет аналогичный инструмент). Если это все, что вы хотите, то, возможно, то, что вы действительно хотите сделать, - это сквош, все ваши слияния подчиняются только одному из их родителей (поэтому они выглядят как единичная фиксация вместо слияния). Это больше похоже на то, что svn и p4 записали в своей собственной исторической модели, где слияния просто выглядят как одиночная фиксация в линейном потоке. Вероятно, вы можете сделать это с помощью git -filter-branch или т.п. Конечно, это потеряло бы всю историю, которая произошла на дочерних ветвях... но пользователи p4 используются, чтобы не иметь эту информацию.

Ответ 2

Вы проверили инструмент "портной"? Он построен для синхронизации различных VCS: es. Он должен иметь поддержку Perforce.

В качестве побочной заметки моя первая реакция будет заключаться в серьезном сомнении в решении, но, я думаю, вы уже это сделали.

Ответ 3

Я думаю, вам следует попробовать с Tortoise SVN, а затем Hg с учетом обновления одной ветки или вы можете сказать, что миграция. Удостоверьтесь, что у вас есть все клонированные дампы, находящиеся на безопасной стороне. Удачи!