6

我想将源代码树从 perforce 迁移到 git。源代码包含分散在 perforce 仓库中的多个开发分支,不一定在同一目录中。例如结构是这样的 -

//depot/dev/project/master 
//depot/dev/project/branch1 
//depot/dev/project/branch2
//depot/dev/sub-project/branch3 
//depot/dev/sub-project/branch4 
//depot/patch-project/branch5 
//depot/patch-project/special/developern/branch6 

我浏览了 git-p4 文档https://git-scm.com/docs/git-p4 BRANCH DETECTION 部分以及类似的文章http://forums.perforce.com/index.php?/topic/1395-git- p4 和多个分支/

我能够迁移具有历史记录的分支,用于直接父级下的分支,例如

 //depot/dev/project/branch1 and 
 //depot/dev/project/branch2 

我无法实现的是如何一次将所有六个分支一起迁移。

在指定分支规范后,我尝试在 //depot@all 级别上运行迁移,但是由于 perforce 服务器很大,它失败了,它给出了 maxresults 异常或会话超时。有人可以指导如何处理这种情况吗?

我看到的另一种选择是单独迁移分支(一个分支到一个 git repo),然后将所有分支合并到一个新的 git repo。我不确定这样做是否会产生影响/不利因素。

Thanks and Regards,
Amar Kumbhar.
4

3 回答 3

12

总结: 它的工作原理,git-p4 是一个很棒的工具,非常智能,带有很多可配置的选项。分散在仓库树各处的多个分支成功迁移。我们需要在涵盖所有子目录或感兴趣的分支的最高级别(最顶层)perforce 目录中运行导入。为了高效操作,建议使用--changesfile选项,明确指定要导入的更改列表。还使用git-p4.branchUsergit-p4.branchList来明确指定分支规范。

详细信息: 这里我展示了对我有用的设置。可能有更好的方法来实现目标。

Perforce 仓库结构:(如问题所述)

Perforce 客户端: 设置在最高(最顶层)p4 目录。这非常重要,否则 git-p4 可能会将更改列表(由于客户端视图限制)排除为空提交。

   //depot/... //myp4client/...

Perforce 分支规范:我创建了一个涵盖所有分支依赖(父/子)信息的分支规范

$ p4 branch -o test1 | grep "//"

    //depot/dev/project/master/... //depot/dev/project/branch1/...
    //depot/dev/project/master/... //depot/dev/project/branch2/...
    //depot/dev/project/branch1/... //depot/dev/sub-project/branch3/...
    //depot/dev/project/branch1/... //depot/dev/sub-project/branch4/...
    //depot/dev/project/master/... //depot/patch-project/branch5/...
    //depot/patch-project/branch5/... //depot/patch-project/special/developern/branch6

git-p4 配置项: 接下来,我设置了一个空的 git 存储库和以下配置项。

 mkdir workdir
 cd workdir
 git init

(** perforce 变量)

git config git-p4.user myp4user
git config git-p4.passwowrd myp4password
git config git-p4.port myp4port
git config git-p4.client myp4client

(** 强制使用 perforce 客户端规范)

git config git-p4.useClientSpec true
git config git-p4.client myp4client

( ** 限制探索仅由我创建的分支规范)

git config git-p4.branchUser myp4user

(**分支信息,依赖关系,有趣的是只需要提及姓氏(分支路径中的目录名称),git-p4会自动检测/选择需要的内容,即完全扩展分支名称)

git config git-p4.branchList master:branch1
git config --add git-p4.branchList master:branch2
git config --add git-p4.branchList branch1:branch3
git config --add git-p4.branchList branch1:branch4
git config --add git-p4.branchList master:branch5
git config --add git-p4.branchList branch5:branch6

Changelists 文件: 接下来,我收集了所有要迁移的分支的所有更改列表。

p4 changes //depot/dev/project/master/...  | cut -d' ' -f2 >> master.txt
p4 changes //depot/dev/project/branch1/...  | cut -d' ' -f2 >> master.txt
p4 changes //depot/dev/project/branch2/...  | cut -d' ' -f2 >> master.txt
p4 changes //depot/dev/sub-project/branch3/...  | cut -d' ' -f2 >> master.txt
p4 changes //depot/dev/sub-project/branch4/...  | cut -d' ' -f2 >> master.txt
p4 changes //depot/patch-project/branch5/...  | cut -d' ' -f2 >> master.txt
p4 changes //depot/patch-project/special/developern/branch6/...  | cut -d' ' -f2 >> master.txt

sort -n master.txt | uniq > master_sorted.txt

导入: 最后我运行如下导入,我使用“同步”而不是克隆。

cd workdir 
../git-p4.py sync //depot/... --detect-branches --verbose --changesfile /home/myp4user/master_sorted.txt

在较小的仓库上“ ../git-p4.py sync //depot@all --detect-branches --verbose ”也应该工作,在这种情况下不需要创建更改列表文件(前面的步骤)

导入完成后,我可以看到 git-p4 在单个 git 存储库中创建了所有远程 perforce 分支。

 git branch -a
  remotes/p4/depot/dev/project/master
  remotes/p4/depot/dev/project/branch1
  remotes/p4/depot/dev/dev/project/branch2
  remotes/p4/depot/dev/dev/sub-project/branch3
  remotes/p4/depot/dev/dev/sub-project/branch4
  remotes/p4/depot/patch-project/branch5
  remotes/p4/depot/patch-project/special/developern/branch6

然后我从远程 p4 分支创建了本地分支

  git checkout -b master  remotes/p4/depot/dev/project/master
  git checkout -b branch1  remotes/p4/depot/dev/project/branch1
  git checkout -b branch2   remotes/p4/depot/dev/dev/project/branch2
  git checkout -b branch3   remotes/p4/depot/dev/dev/sub-project/branch3
  git checkout -b branch4   remotes/p4/depot/dev/dev/sub-project/branch4
  git checkout -b branch5   remotes/p4/depot/patch-project/branch5
  git checkout -b branch6   remotes/p4/depot/patch-project/special/developern/branch6

接下来我简单地添加了一个远程源并将代码推送到 git repo 中。
感谢 stackoverflow 和在线提供的各种指针/帮助。

于 2016-06-07T08:05:03.130 回答
0

最新版本的 git-p4 不应报告 maxresults 异常,因为它一次将检索最多 500 个更改。您可以尝试使用参数修改此值--changes-block-size,这可能会帮助您克服报告的问题。

这是这个参数的描述,可以在这里看到:

--changes-block-size <n>::
    The internal block size to use when converting a revision
    specifier such as '@all' into a list of specific change
    numbers. Instead of using a single call to 'p4 changes' to
    find the full list of changes for the conversion, there are a
    sequence of calls to 'p4 changes -m', each of which requests
    one block of changes of the given size. The default block size
    is 500, which should usually be suitable.
于 2016-06-04T17:36:33.873 回答
0

我之前遇到过类似的问题,就我而言,我必须找到一种解决方法,即您所描述的解决方法,我将每个分支克隆到它自己的 Git 存储库中。

即便如此,个别分支也有太多对象,P4 管理员也不愿意为请求的对象设置上限,所以我还必须限制我克隆的历史记录数量。

对于非活动分支,我只会克隆最新版本并丢弃其所有历史记录。

对于更活跃的分支,我会保留 4-6 周的历史记录。

这意味着您必须手动确定要保留的历史记录数量的 CL 编号:

来自git-p4文档(部分:DEPOT PATH SYNTAX):

$ git p4 clone //depot/my/project@1,6 # Import only changes 1 through 6.

于 2016-06-04T18:20:03.490 回答