公司某项目使用了Perforce 作为版本控制工具,通过内部分享的ppt了解到它和svn、git有着挺大区别,也很容易误操作,偶然间发现Git可以为Perforce 的客户端,或许这样能保险点。
使用Git管理Perforce有两种方案:
Perforce Git Fusion
这是Perforce公司提供的一种方案,主要是在Perforce服务端配置 Git Fusion,客户端使用标准的Git操作。
我认为这是最好的用Git管理Perforce的方案,不过需要super用户创建,所以我无法实际使用。
部署很方便,Perforce提供了虚拟机镜像,按照提示和文档配置即可。
Collaborating within a Git ecosystem
Git p4
Git p4是Git项目提供的一种方案,它是个Python脚本,封装了P4命令。
相关文档:Git - git-p4 Documentation
安装及部署
- 安装P4V或P4,推荐P4V
- 安装 Git Client
- 安装 Python2
-
使用P4V建立工作区并取代码(可选)
这一步并非必须,但用它可以减少一些Git p4的配置,比如密码不需要保存在Git的配置文件中了。
使用示例
如果无法使用git p4命令可以参考其文档中的方法,修改对应配置文件改为可用,或者直接使用git_p4这个脚本。
-
取Perforce库到本地:
$ git p4 clone //depot/path/project
-
使用Git命令提交到本地库:
$ cd project
$ vi foo.h
$ git commit -a -m "edited foo.h"
-
更新本地库到Perforce库最新版本:
$ git p4 rebase
-
提交本地库到Perforce库:
$ git p4 submit
常见问题
-
编码问题
首先确定服务器有没有开启Unicode mode,如果没开启,需要根据团队的喜好猜测编码,比如,我们团队内文件名和注释有中文和英文,成员大都使用Windows,由此可推测编码应当是GB2312(或GBK)
-
环境配置问题
Windows 建议先使用P4V取库,它会创建一些环境变量,减少Git p4的配置。
Linux 建议先使用先设置如下的环境变量,调用P4 login,减少Git p4的配置。
export P4USER=username export P4PORT=192.168.1.1:1666 export P4CLIENT=MyClient
-
服务器未配置(一般使用P4V后不用配置)
$ git config --global git-p4.port "192.168.1.1:1666"
-
用户未配置
$ git config --global git-p4.user "username"
-
密码未配置
$ git config --global git-p4.password "password"
-
路径乱码
$ git config --global git-p4.pathEncoding "gb2312"
-
日志乱码
使用我修改过的git-p4 (已提交pr,尚未通过)
$ git config --global git-p4.descEncoding "gb2312"
-
-
各种错误处理
Git p4是对P4命令的封装,建议根据报错阅读脚本,在控制台执行对应的P4命令进行解决。
-
提交时提示: could not get client spec.
执行
p4 -u username client
编辑配置文件中的以下两条:Client: XXX-PC
Root: E:\PerforceCache
这会建立一个名为
XXX-PC
的Workspace
,并且将路径设在E:\PerforceCache
,如果之前用P4V
取过,可以直接设置为对应的配置。如果工作区没有取过,第一次提交时将会取工作区,这会消耗一段时间,并输出大量的提示,切莫慌张。 -
提交时提示: You have files opened with perforce! Close them before starting the sync.
这是因为执行
p4 -u username opened
提示有文件被打开了,可以根据其输出revert对应的文件,如果确认没啥重要的东西,可以直接用p4 -u username revert -a
也可以通过P4V的Pending界面来回滚响应的文件。
-
提交时提示: Submission cancelled, undoing p4 changes. 的提示,是因为
edit_template
函数执行失败导致的。$ git config --global git-p4.skipSubmitEdit true
-