Наша команда хочет перенести наш сервер perforce на Git. Есть ли способ синхронизировать проверки из ветки на нашем сервере Github обратно в Perforce, чтобы синхронизировать их? Я просматривал git-p4, и, похоже, там много документации о том, как синхронизировать Perforce -> Git, но не наоборот. В идеале я хотел бы, чтобы он синхронизировался в обоих направлениях принудительно ‹-> git, возможно ли это с p4-git?
Ищем способ синхронизации Perforce ‹-› Git
Ответы (5)
Perforce GitFusion может это сделать, но разработчику придется отправлять изменения на сервер GitFusion, а не на сервер github.
В большинстве случаев конфликты слияния разрешались автоматически. Перфорс был «мастером». Люди, отправлявшие данные из Perforce, всегда получали свои изменения сразу. Люди, отправляющие сообщения из git, получат свои изменения через этот процесс:
- заблокировать главный репозиторий git
- получить изменения p4 вверх по течению
- перебазировать против восходящего потока p4
- отправьте на p4, если все прошло нормально
Это по-прежнему оставляет очень маленькое окно между (3) и (4), когда кто-то в Perforce может отправить конфликтующее изменение в те же файлы. Но на практике это случалось всего пару раз, в течение нескольких лет, наверное, сотни коммитов в неделю.
В этих двух случаях я вошел и исправил все вручную, что было немного неуклюже. Я думаю, вы могли бы легко автоматически отказаться от проблемного изменения, но, в конце концов, переход на git полностью устранил эту проблему.
Git-p4 разработан таким образом, что репозиторий git инициализируется данными, импортированными из Perforce. После этого начального импорта двусторонняя связь между репозиториями git и Perforce полностью поддерживается, за исключением ветвей/слияний, поддержка которых ограничена.
Чтобы импортировать обновления из Perforce в git:
git p4 sync
Чтобы отправить изменения из git в Perforce:
git p4 submit
Дополнительные сведения о настройке git-p4 см. в его документации.
Обновление: я всегда советую тестировать любые потоки во временных репозиториях перед развертыванием.
В прошлом я устанавливал что-то вроде этого. У меня было репозиторий gitolite и сервер p4. Изменения, отправленные в репозиторий gitolite, будут подхватываться заданием cron и превращаться в коммиты P4 (через отправку git-p4). Точно так же изменения, отправленные на p4, будут подхвачены тем же заданием cron и синхронизированы обратно с git (через git p4 rebase).
Было задействовано два репозитория git: репозиторий gitolite, которому привержены обычные разработчики git, и отдельный репозиторий на основе git-p4, в котором выполнялись операции git-p4.
У меня был довольно небольшой сценарий оболочки для координации всего. Основными сложными участками были:
блокировка: вам нужно принудительно перебазировать репозиторий gitolite, поэтому вам нужен какой-то способ гарантировать, что разработчики не потеряют изменения, когда это произойдет (я использовал файл блокировки).
Слияние конфликтов. Очень редко два человека одновременно редактировали один и тот же раздел файла в P4 и git.
Я сам столкнулся с этой проблемой и насколько я знаю ничего подобного нет.
В моем случае я должен в основном:
- Создайте патч для изменений в 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
).