这是我的情景:
我有两个项目projectA和projectB。 branchspec将projectA自动集成到projectB。 现在,我有一个更改列表来修改projectA中的一些文件 - 我还没有提交/提交此更改列表。
我希望这个更改列表只能进入projectB。
做一个 p4集成-b branchspec -c changelistNumber
显示
“所有版本都已整合。”
如何整合未提交的更改列表?
答案 0 :(得分:32)
Perforce有一种更简单的方法来实现这一目标:
将您的更改列表存放在branchA上(请注意更改列表#,我们将其称为NUM以供参考)
在branchA和branchB之间创建分支映射(我们称之为A_to_B)
运行以下命令:
p4 unshelve -s NUM -b A_to_B
答案 1 :(得分:11)
Hack-ish解决方案:
另一种方法是创建一个单独的分支,您可以在其中进行工作,然后根据需要集成到A或B.
一般的想法是Perforce在提交或搁置的变更列表方面起作用。整合非承诺变更清单的想法似乎与Perforce的天然颗粒相悖,这使得这些变通办法变得繁琐。
答案 2 :(得分:5)
p4 diff -u your/branch/... | patch -p x -d your/otherbranch
如果x是一个int,你应该从0开始尝试直到它正常工作,在补丁中使用--dry-run进行测试。 (-p是要剥离的目录的编号,以便/ branch和/ otherbranch中的文件路径匹配,在本例中为2)
答案 3 :(得分:3)
我刚刚碰到了同样的情况,这是我的解决方案(非常类似于杰夫,但在此过程中没有提交),也许有一天会帮助某人:
答案 4 :(得分:0)
您可以使用P4_Shelve将更改移动到新分支,然后可以将其集成到projectB。
答案 5 :(得分:0)
敲了一个快速的PowerShell 2脚本来执行此操作:
https://gist.github.com/1173044
param([int]$changelistNum, [string]$destBranch)
$regex = "^\s+//[^/]+(/\S+)\s"
$sourceFiles = p4 change -o $changelistNum | select-string $regex | %{$_.matches[0]}
$sourceFiles | %{
$sourcePath = (p4 where $_.groups[0].value.trim()).split(' ')[2];
$destPath = (p4 where ($destBranch + $_.groups[1].value)).split(' ')[2];
p4 edit $destPath;
copy $sourcePath $destPath;
p4 add $destPath;
}
(不确定为什么缩进不能在上面工作 - 我在脚本块的内部加了8个空格?)
脚本从更改列表描述中提取所有文件,并且每个文件都尝试在另一个分支中找到相应的路径。它强制强制每个文件的p4编辑和p4添加,而不是试图猜测哪一个是正确的。这很冗长!
将更改列表443复制到分支myBranch:
Copy-PendingChangelistToBranch.ps1 443 "//myBranch"