正如我在previous question中提到的,我正在考虑将源控制从Perforce迁移到git。
环顾四周,我发现git-p4(你需要多挖一点,因为它甚至不在链接指向的存储库中。实际的git-p4 script更难找到)。
我现在正在运行这个脚本,它会在新的git存储库中导入当前版本的文件,但无论我做什么,我都无法获得历史记录。
这是我使用的当前命令行:
P4CLIENT=my-p4-clientspec git-p4 clone --max-changes=1000 --use-client-spec //p4/path/to/be/imported/...
所以,真正的问题是:如果有人设法导入P4仓库,包括历史记录,我想知道你是如何做到的。
答案 0 :(得分:19)
尝试将“@all”附加到文件路径。例如,这会为我生成一个单一版本的回购:
python /usr/share/doc/git-core/contrib/fast-import/git-p4 clone --destination=master-pom \
//depot/services/master-pom/trunk/...
此命令导入完整历史记录:
python /usr/share/doc/git-core/contrib/fast-import/git-p4 clone --destination=master-pom \
//depot/services/master-pom/trunk/...@all
我尝试使用git-p4示例,但由于几个原因放弃了,并编写了我自己的快速导入泵。这是一段时间了,所以现在可能已经修复了一些问题:但是git-p4遇到了大型更改列表的问题(例如最初创建了一个分支)(尽管使用客户端规范可能有所帮助,但我没有我认为我试过了)和带有“+ S”文件类型修饰符的文件(这是Bad And Evil,但我们曾经使用它)。我的Python-fu不能让我解决我遇到的问题。
编辑:既然有人要求,就在这里。https://github.com/araqnid/p4utils有几个p4的东西,其中p4-git-xfer是p4-> git(单向)复制子。它有很多问题,因为它主要是个人的便利工具,而不是真正的基础设施。
入门:
p4-git-xfer clone -d $PWD/dictionary.git -n //depot/services/midoffice/dictionary/... \
trunk 'release/*' 'branch/*' \
trunk=master release/*=r* branch/*=dev/*
将perforce路径克隆为裸“dictionary.git”。基本路径之后的第一个参数是“分支规范”,它告诉复制器在哪里找到基础下的分支。后面的(带有'='符号)是“镜像规范”,告诉复制器如何从导入的分支创建本地分支。分支规范导致创建“refs / remotes / p4 / trunk”,“refs / remotes / p4 / release / 1.0”等。镜像规格强制“refs / heads / master”镜像“refs / remotes / p4 / trunk”,“refs / heads / r1.0”镜像“refs / remotes / p4 / release / 1.0”等。作为一种允许我从复制的特定分支中选择特定分支以便传播到克隆的方法。
它会尝试检测分支的创建方式,但对Perforce来说这是一个猜测。除此之外,它根本不会尝试进行任何分支跟踪:即使是全分支合并也不会被写出来,抱歉。
在初始克隆之后,从git副本内部运行p4-git-xfer fetch
将执行增量更新。高水位变更列表取自git仓库中的marks/p4
。这是一个快速导入加载的标记文件,所以如果你做任何花哨的步法,比如使用filter-branch来重写东西,请注意你也可能需要更新它。
它不漂亮,并且有一些中等到严重的问题;我主要是为了方便起见,将自己与Perforce问题隔离开来,而不是作为日常的基础设施组件。它是单向的:我通常使用p4-am脚本来应用git format-patch
创建的补丁。这本身只适用于一般解析肮脏,文件结尾换行问题,二进制更改等。
答案 1 :(得分:0)
我也想弄清楚git-p4。遗憾的是,没有太多的文档。我想和你取得联系,因为我们可以互相帮助。
答案 2 :(得分:0)
如果python创建问题,以防万一在python的环境变量中没有工作设置路径 设置P4CLIENT = git
答案 3 :(得分:-1)
git-p4帮助实际上非常好:
man git-p4
在Ubuntu 12.04上,它包含在git-man
包中。