git-p4 桥接:用 Git 操作 Perforce
November 6, 2024About 2 min
git-p4 桥接:用 Git 操作 Perforce
团队主仓库在 Perforce(P4),但自己想用 Git 的工作流,这时候 git-p4 就派上用场。它把 P4 depot 映射成本地 Git 仓库,在本地用 Git 提交,再同步回 P4。
工作模型先理清
用之前得先搞清几条规则,不然提交会报错:
- git-p4 是一个用 Git 来操作 P4 的桥接工具。
- Git 远程仓库(如果你同时挂了一个)不允许直接 push。
- 本地的 Git commit 必须先 submit 到 P4,然后才能 push 到 Git 远程仓库。
- 如果 P4 和本地 Git 冲突,push 时会自动 rebase。
- 如果 Git 远程仓库里有还没 submit 到 P4 的 commit,
git-p4 submit会报错。
一句话:P4 是真相之源,Git 远程只是镜像,提交方向永远是本地 → P4 → Git 远程。
环境准备
官方文档:https://git-scm.com/docs/git-p4。Windows 下需要:
- python3
- git
- p4(命令行客户端)
Step 1:设置 P4 环境变量
用占位符,换成自己环境的真实值:
p4 set P4PORT=<P4SERVER>:1666
p4 set P4USER=<user>
p4 set P4CLIENT=<workspace>
p4 set P4PASSWD=<password>
echo <password>|p4 login
Step 2:建本地 Git 仓库并 clone P4
:: 在已经登录 p4 的终端里操作
mkdir <git_repo_dir> :: 建 git 仓库目录
cd /d <git_repo_dir>
git-p4.py clone <depot_path://test/test> --destination <git_repo_dir>
:: 如果要同时挂 Git 远程
git remote add origin <git_url>
:: 把 git-p4.py 拷到 git-core 目录,例如:
:: C:\Program Files\Git\mingw64\libexec\git-core\git-p4
把 git-p4.py 拷进 git-core 目录后,就能直接用 git p4 ... 子命令,不用每次写完整脚本路径。
同步 P4 → 本地 Git
git-p4.py sync :: 自动创建对应的 git commit
:: git-p4.py rebase :: 如果 sync 没真正把文件同步下来,用 rebase
sync 把 P4 上的新变更拉成 Git commit;偶尔 sync 没把工作区文件刷新时,改用 rebase。
提交 本地 Git → P4
:: 跳过提交时弹出修改 description(让 CL description 跟 git description 一致)
git config git-p4.skipSubmitEdit true
:: 注意: 先确认你的 git commit 已经 push 到 Git 远程仓库
git-p4.py submit :: 提交所有未同步的 git commit
git-p4.py submit --commit <sha1> :: 只提交单个 commit
git-p4.py submit --commit <sha1..sha1> :: 提交区间内的多个 commit
skipSubmitEdit true 省掉每次 submit 都弹编辑器改 description 的麻烦,直接拿 git 的提交信息当 P4 的 CL description。
把 Git patch 应用到 P4 workspace
有时不走 git-p4 全套,只是想把别人给的一个 .diff / .patch 打到 P4 workspace 上。用 Git Bash 在 P4 workspace 根目录执行:
patch -p1 < diff.patch
关键是 -p1:Git 生成的补丁里,文件路径前面通常多一级 a/ 或 b/(表示旧文件和新文件),而这级目录在本地实际结构里并不存在。-p1 去掉路径里的第一级,正好匹配上本地文件路径。如果发现还对不上,试试 -p0 或更大的数。