У меня есть задача по переносу моей команды и источника из git в Perforce, и я ищу идеи о том, как перенести историю git в p4.
Я был бы рад только перемещению мастер ветки. Однако даже это оказывается проблематичным.
Я использую замечательный инструмент git-p4. Я создаю область назначения в моей рабочей области p4 и использую git p4 clone //depot/StuffFromGit
, чтобы начать отслеживать ее в git-p4. Я прививаю все изменения моего git-репозитория в клон git-p4. Затем я могу git p4 submit
и все готово, все изменения помещаются в p4.
Отлично работает, когда история git выглядит так, красиво и линейно:
A---B---C---D
Проблема связана с тем, что над проектом работают несколько человек. Даже при том, что они работают над мастером, это все еще создает ветви, которые разделяются и объединяются Тем не менее, git-p4 смело справляется с этим:
A---B---C---E
\--D--/
git p4 перемещается в порядке, фиксируя 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 filter-branch, чтобы удалить все упоминания о конфликтующих файлах. Я бы получил комментарии к истории, хотя пропустил много изменений файла. Приблизительно с 3000 коммитами в истории я бы удалил историю всех ключевых (занятых) файлов. В конце импорта отфильтрованных файлов я бы добавил недостающие файлы обратно, сделав окончательную фиксацию HEAD.
- Сбросить историю, сделать один коммит p4 из HEAD (просто, но грустно).
- Не переходите к p4: я работал над этой идеей как можно дольше.
Ничего из этого не очень хорошо. Любые идеи о том, как git 'gt p4 rebase' или 'git p4 submit' работают?