2010-10-15 3 views
16

У меня есть задача переместить мою команду & источник от git to Perforce, и я ищу идеи о том, как переместить историю git в p4.Миграция с git на Perforce

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

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

Это прекрасно работает, когда история мерзавец выглядит так, красиво и линейна:

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

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

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

мерзавец 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, чтобы понять это? Это расстраивает, так как слияния есть.

Мысли у меня были:

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

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

+14

Учитывая историю git, это своего рода смешное направление для миграции. –

+2

Похоже, что git-p4 пытается объединить C, D ** и ** E и, конечно же, неудачно. Вы проверили, что вы используете последнюю версию git-p4, и если есть некоторые исправления или другие люди видели ту же проблему? –

+16

Ничего себе, мужик, извините. Похоже, вы двигаетесь, как 10-15 лет назад. – Jonathan

ответ

6

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

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

+0

Perforce обычно не использует sub -branches, но может быть, если вы хотите управлять ветвями. Тогда информация есть. –

-2

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

2

Вы проверили инструмент «портной»? Он построен для синхронизации различных VCS: es. Предполагается, что он поддерживает Perforce.

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