Ama*_*har 5 git perforce branch git-p4
我想将源代码树从perforce迁移到git.源代码包含分散在perforce depot中的几个dev分支,不一定在同一目录中.例如,结构是这样的 -
//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
Run Code Online (Sandbox Code Playgroud)
我去了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
Run Code Online (Sandbox Code Playgroud)
我无法实现的是如何一次将所有六个分支迁移到一起.
我在指定分支规范后尝试在// depot @ all级别上运行迁移,但由于perforce服务器很大,它会失败,它会产生maxresults异常或会话超时.有人可以指导如何处理这种情况吗?
我看到的另一个选项是单独迁移分支(一个分支到一个git repo),然后将所有分支合并到一个新的git repo中.我不确定这样做会产生什么影响/不利影响.
Thanks and Regards,
Amar Kumbhar.
Run Code Online (Sandbox Code Playgroud)
Ama*_*har 10
总结: 它很有用,git-p4是一个很棒的工具,非常智能,有很多可配置的选项.多个分支分散在跨库存树成功迁移的任何位置.我们需要在最高级别(最顶层)的perforce目录中运行导入,该目录涵盖所有子目录或感兴趣的分支.为了有效运行,建议使用--changesfile选项,以明确指定要导入的更改列表.还可以使用git-p4.branchUser和git-p4.branchList来显式指定branchspecs.
详情: 我在这里展示了适合我的设置.可能有更好的方法来实现目标.
Perforce仓库结构:(如上所述)
Perforce客户端: 这是在最高(最顶层)的p4目录中设置的.这非常重要,否则git-p4可能会将更改列表(由于客户端视图而受限制)排除为空提交.
//depot/... //myp4client/...
Run Code Online (Sandbox Code Playgroud)
Perforce branchspecs:我创建了一个包含所有分支依赖(父/子)信息的branchspec
$ 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
Run Code Online (Sandbox Code Playgroud)
git-p4配置项: 接下来,我设置了一个空的git存储库并跟随配置项.
mkdir workdir
cd workdir
git init
Run Code Online (Sandbox Code Playgroud)
(**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
Run Code Online (Sandbox Code Playgroud)
(**强制使用perforce客户端规范)
git config git-p4.useClientSpec true
git config git-p4.client myp4client
Run Code Online (Sandbox Code Playgroud)
(**限制探索仅由我创建的branchspecs)
git config git-p4.branchUser myp4user
Run Code Online (Sandbox Code Playgroud)
(**分支信息,依赖关系,有趣的只有姓氏(分支路径中的目录名)需要提及,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
Run Code Online (Sandbox Code Playgroud)
更改 列表文件:接下来,我为所有正在迁移的分支收集了所有更改列表.
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
Run Code Online (Sandbox Code Playgroud)
导入: 最后我运行导入如下,我使用"同步"而不是克隆.
cd workdir
../git-p4.py sync //depot/... --detect-branches --verbose --changesfile /home/myp4user/master_sorted.txt
Run Code Online (Sandbox Code Playgroud)
在较小的depots上"../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
Run Code Online (Sandbox Code Playgroud)
然后我从远程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
Run Code Online (Sandbox Code Playgroud)
接下来我简单地添加了一个远程源并将代码推送到git repo中.
感谢stackoverflow和在线提供的各种指针/帮助.