Ищем способ синхронизации Perforce ‹-› Git

Наша команда хочет перенести наш сервер perforce на Git. Есть ли способ синхронизировать проверки из ветки на нашем сервере Github обратно в Perforce, чтобы синхронизировать их? Я просматривал git-p4, и, похоже, там много документации о том, как синхронизировать Perforce -> Git, но не наоборот. В идеале я хотел бы, чтобы он синхронизировался в обоих направлениях принудительно ‹-> git, возможно ли это с p4-git?


person bobster    schedule 01.06.2015    source источник


Ответы (5)


Perforce GitFusion может это сделать, но разработчику придется отправлять изменения на сервер GitFusion, а не на сервер github.

person cmcginty    schedule 05.06.2015

В большинстве случаев конфликты слияния разрешались автоматически. Перфорс был «мастером». Люди, отправлявшие данные из Perforce, всегда получали свои изменения сразу. Люди, отправляющие сообщения из git, получат свои изменения через этот процесс:

  1. заблокировать главный репозиторий git
  2. получить изменения p4 вверх по течению
  3. перебазировать против восходящего потока p4
  4. отправьте на p4, если все прошло нормально

Это по-прежнему оставляет очень маленькое окно между (3) и (4), когда кто-то в Perforce может отправить конфликтующее изменение в те же файлы. Но на практике это случалось всего пару раз, в течение нескольких лет, наверное, сотни коммитов в неделю.

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

person Luke    schedule 07.02.2019
comment
Спасибо. В настоящее время я имею дело с той же проблемой и пришел к аналогичному решению. Хотя у меня есть сервер GitLab, над которым у меня нет большого контроля, и моего уровня недостаточно для включения блокировки файлов, поэтому в настоящее время я планирую сделать мастер-защищенные только для слияния и объединить MR с помощью автоматизации только после того, как они будут отправлено на P4 успешно. Надеюсь, это работает так же хорошо, как и в вашем случае. Это не идеально, поскольку между фиксациями P4 и Git нет 1-1, но в моем случае репозиторий Git уже имеет собственную расходящуюся историю, и похоже, что в вашем случае вы сохранили все фиксации, синхронизированные с P4. - person Dan M.; 08.02.2019

Git-p4 разработан таким образом, что репозиторий git инициализируется данными, импортированными из Perforce. После этого начального импорта двусторонняя связь между репозиториями git и Perforce полностью поддерживается, за исключением ветвей/слияний, поддержка которых ограничена.

Чтобы импортировать обновления из Perforce в git:

git p4 sync

Чтобы отправить изменения из git в Perforce:

git p4 submit

Дополнительные сведения о настройке git-p4 см. в его документации.

Обновление: я всегда советую тестировать любые потоки во временных репозиториях перед развертыванием.

person Vitor    schedule 02.06.2015
comment
Итак, что я на самом деле ищу, так это синхронизировать ветки между внешней веткой, расположенной на корпоративном сервере github, и внешней веткой на нашем сервере perforce. Мне нужно, чтобы внешние разработчики зарегистрировались во внешнем репозитории github. Я предполагаю, что git-p4 допускает только внешний perforce и локальный репозиторий git? - person bobster; 02.06.2015
comment
Это было бы возможно, если бы репозиторий github все еще не был инициализирован, потому что в противном случае SHA коммитов не будет совпадать. - person Vitor; 02.06.2015

В прошлом я устанавливал что-то вроде этого. У меня было репозиторий gitolite и сервер p4. Изменения, отправленные в репозиторий gitolite, будут подхватываться заданием cron и превращаться в коммиты P4 (через отправку git-p4). Точно так же изменения, отправленные на p4, будут подхвачены тем же заданием cron и синхронизированы обратно с git (через git p4 rebase).

Было задействовано два репозитория git: репозиторий gitolite, которому привержены обычные разработчики git, и отдельный репозиторий на основе git-p4, в котором выполнялись операции git-p4.

У меня был довольно небольшой сценарий оболочки для координации всего. Основными сложными участками были:

  • блокировка: вам нужно принудительно перебазировать репозиторий gitolite, поэтому вам нужен какой-то способ гарантировать, что разработчики не потеряют изменения, когда это произойдет (я использовал файл блокировки).

  • Слияние конфликтов. Очень редко два человека одновременно редактировали один и тот же раздел файла в P4 и git.

person Luke    schedule 08.06.2015
comment
Привет. Как вы справлялись с конфликтами слияния? Кроме того, что вы подразумеваете под перебазированием? Вы использовали сгенерированное git p4 зеркало в качестве основной ветки разработки для git? - person Dan M.; 06.02.2019
comment
Я добавлю более длинный ответ ниже. - person Luke; 08.02.2019

Я сам столкнулся с этой проблемой и насколько я знаю ничего подобного нет.

В моем случае я должен в основном:

  • Создайте патч для изменений в Git: git diff sha1..sha2 > mypatch.diff
  • Составьте список затронутых файлов: git diff --name-only sha1..sha2 > files.list
  • Примените патч в репозитории P4: git apply mypatch.diff
  • Согласовать изменения в P4: for each file in files.list; p4 reconcile $file; done
  • Отредактируйте свой список изменений P4, а затем отправьте его (я уверен, что это тоже можно автоматизировать, но мне это не нужно).

У меня есть пара скриптов, которые помогают мне в этом, вы можете найти их здесь: https://github.com/pgpbpadilla/git-p4-helpers#sharing-changes-git-p4

Я использую этот рабочий процесс примерно 6 месяцев, и он работает в большинстве случаев.

Предостережения

  • Это создает единый список изменений для всех коммитов в диапазоне sha (a..b).
person pgpb.padilla    schedule 04.02.2016