总结: 好用,git-p4 是一个很棒的工具,非常智能,带有很多可配置的选项。分散在仓库树各处的多个分支成功迁移。我们需要在涵盖所有子目录或感兴趣的分支的最高级别(最顶层)perforce 目录中运行导入。为了高效操作,建议使用 --changesfile 选项,明确指定要导入的更改列表。还可以使用 git-p4.branchUser 和 git-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
变更列表文件:接下来,我收集了所有变更列表,用于我要迁移的所有分支。
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
在较小的 depot 上“ ../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 和在线提供的各种指针/帮助。