Perforce:我如何p4集成本地未提交的更改列表?

时间:2010-03-18 18:53:56

标签: perforce

这是我的情景:

我有两个项目projectA和projectB。 branchspec将projectA自动集成到projectB。 现在,我有一个更改列表来修改projectA中的一些文件 - 我还没有提交/提交此更改列表。

我希望这个更改列表只能进入projectB。

做一个 p4集成-b branchspec -c changelistNumber

显示

“所有版本都已整合。”

如何整合未提交的更改列表?

6 个答案:

答案 0 :(得分:32)

Perforce有一种更简单的方法来实现这一目标:

  1. 将您的更改列表存放在branchA上(请注意更改列表#,我们将其称为NUM以供参考)

  2. 在branchA和branchB之间创建分支映射(我们称之为A_to_B)

  3. 运行以下命令:

    p4 unshelve -s NUM -b A_to_B
    

答案 1 :(得分:11)

Hack-ish解决方案:

  1. 查看项目B中的文件
  2. 将项目A中的文件手动复制到项目B(由于步骤1,它们没有写保护)
  3. 搁置项目A中的更改列表
  4. 提交至B
  5. 将文件从B集成到A并解决
  6. 取消隐藏第3步中的文件。根据需要决定是否接受您的文件。
  7. 准备好后提交给A
  8. 另一种方法是创建一个单独的分支,您可以在其中进行工作,然后根据需要集成到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)

我刚刚碰到了同样的情况,这是我的解决方案(非常类似于杰夫,但在此过程中没有提交),也许有一天会帮助某人:

  1. 在编辑但未提交的文件存在的同时,将相关文件从ProjectB集成(并解析)到ProjectA。
  2. 检查ProjectB中的相关文件。
  3. 将相关文件从ProjectA手动复制到ProjectB。
  4. 还原ProjectA中的文件。

答案 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"