使用git-p4获取整个文件历史记录

joc*_*oce 15 migration git perforce git-p4

正如我在前一个问题中提到的,我正在考虑将源代码控制从Perforce迁移到git.
环顾四周,我发现的git-P4(你要挖多一点,因为它不是即使在该链接指向存储库,实际的git-P4脚本很难找到).

我现在正在运行这个脚本,它在新的git存储库中导入了当前版本的文件,但无论我做什么,我都无法获得历史记录.

这是我使用的当前命令行:

P4CLIENT=my-p4-clientspec git-p4 clone --max-changes=1000 --use-client-spec //p4/path/to/be/imported/...

所以,真正的问题是:如果有人设法导入P4仓库,包括历史记录,我想知道你是怎么做到的.

ara*_*nid 20

尝试将"@all"附加到文件路径.例如,这为我生成了一个单修订版回购:

python /usr/share/doc/git-core/contrib/fast-import/git-p4 clone --destination=master-pom \
    //depot/services/master-pom/trunk/...
Run Code Online (Sandbox Code Playgroud)

此命令导入了完整的历史记录:

python /usr/share/doc/git-core/contrib/fast-import/git-p4 clone --destination=master-pom \
    //depot/services/master-pom/trunk/...@all
Run Code Online (Sandbox Code Playgroud)

我尝试使用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/*
Run Code Online (Sandbox Code Playgroud)

将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来说这是一个猜测.除此之外,它根本不会尝试进行任何分支跟踪:即使是全分支合并也不会被写出来,对不起.

在初始克隆之后,p4-git-xfer fetch从git副本内部运行将执行增量更新.高水位变更列表来自marks/p4git仓库.这是一个快速导入加载的标记文件,所以如果你做任何花哨的步法,比如使用filter-branch来重写东西,请注意你也可能需要更新它.

它不漂亮,并且有一些中等到严重的问题; 我主要是为了方便起见,将自己与Perforce问题隔离开来,而不是作为日常的基础设施组件.它是单向的:我通常使用p4-am脚本来应用由其创建的补丁git format-patch.这本身只适用于一般解析肮脏,文件结尾换行问题,二进制更改等.