我们的团队正在寻求将我们的 perforce 服务器迁移到 Git。有没有办法从我们的 Github 服务器中的一个分支同步签入到 Perforce 以保持同步?我一直在查看 git-p4 ,似乎有很多关于如何同步 Perforce -> Git 的文档,但反之则不然。理想情况下,我希望它以两种方式同步 perforce <-> git,p4-git 可以吗?
5 回答
Perforce GitFusion 可以做到这一点,但开发人员必须将更改推送到 GitFusion 服务器而不是 github 服务器。
大多数时候,合并冲突是自动解决的。Perforce 是“大师”。从 Perforce 提交的人总是让他们的更改直接通过。从 git 提交的人将通过此过程提交更改:
- 锁定主 git repo
- 获取上游 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 repo 和一个 p4 服务器。推送到 gitolite 存储库的更改将由 cron 作业获取并转换为 P4 提交(通过 git-p4 提交)。同样,提交到 p4 的更改将被同一个 cron 作业拾取并同步回 git(通过 git p4 rebase)。
涉及两个 git 存储库:普通 git 开发人员承诺的 gitolite 存储库,以及发生 git-p4 操作的单独的基于 git-p4 的存储库。
我有一个相当小的 shell 脚本来协调一切。主要的棘手领域是:
锁定:您必须强制重新设置 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 个月,它适用于大多数情况。
注意事项
a..b
这将为 sha 范围 ( )中的所有提交创建单个更改列表。