13

精简版:

在 P4 中分支后,如何找到分支的“源”更改列表?

长版:

假设我的项目的主要分支位于

//project/main/...

此处提交的最新更改列表是@123,当我决定为 1.0 版创建一个分支时

//project/1.0/...

从 P4V 开始,一个新的变更列表被创建(比如@130),解决并提交。

在 CLI 中,它看起来像这样:

p4 integrate -c 123 -o //project/main/... //project/1.0/...
p4 submit

后来,我查看下的更改列表//project/1.0,看到@130 更改列表包含很多分支文件。我怎样才能找到更改列表编号。这最初是(即@123)分支的?

4

7 回答 7

8

p4 changes将显示已提交更改列表的列表,可选择过滤到特定路径。

p4 changes //project/main/...
Change 123 ... 'Very last change.'
Change 122 ... 'Next-to-last change.'
Change 100 ... 'Only two changes to go...'
...

这并不奇怪,但是,正如您所发现的,p4 changes当您将所有这些更改集成到一个更改中时,它的帮助会降低:

p4 changes //project/1.0/...
Change 130 ... 'Integrated everything from main.'

诀窍是使用-i包含集成到指定文件中的任何更改列表的选项

p4 changes -i //project/1.0/...
Change 130 ... 'Integrated everything from main.'
Change 123 ... 'Very last change.'
Change 122 ... 'Next-to-last change.'
Change 100 ... 'Only two changes to go...'
...

要准确获得您想要的 ( 123),您需要编写一个脚本来过滤输出p4 changes -i //project/1.0/...以删除列出的任何更改p4 changes //project/1.0/...(然后获取最新的剩余更改)。

(在探索时,我也经常发现该-m max选项很有用。这会将更改限制为 'max' 最近。这有助于您的输出在有很多更改时不会流出屏幕。)

于 2010-11-09T16:03:48.027 回答
1

我不知道有任何简单的命令可以执行您想做的事情。如果您愿意编写一点脚本并且该命令不必快速执行,您也许可以尝试为所有分支文件编写如下脚本:

  1. 查找目标文件的源文件/修订版。

    p4 filelog //project/1.1/foo.bar#1
    //project/1.1/foo.bar
    ... #1 在 2009/07/10 上更改 6416 分支 by foo@bar (text) 'Release 1.1'
    ... ... 从//project/main/foo.bar #1, #2分支

  2. 获取提交源文件/修订的更改列表。

    p4 fstat //project/main/foo.bar#2
    ... depotFile //project/main/foo.bar
    ... headAction edit
    ... headType text
    ... headTime 1201771167
    ... headRev 2
    ... headChange 5353
    ... headModTime 1201770971

  3. 对分支中的所有文件重复此操作,并选择最高更改编号(上面的 headChange),这应该是在为该特定文件分支之前提交给父级的最新更改。您可以使用例如“p4 files //project/1.0/...#1”获得所有分支文件的完整列表。

(或者也许采取简单的方法并询问 Perforce 支持)

于 2010-11-04T13:40:20.263 回答
1

由于到目前为止没有一个答案提供用于查找分支的源或根更改列表的代码,我想我会提供一个单行来做到这一点。这种方法基于@Cwan 的建议,并将打印创建分支的“父”更改列表。该FIRST_BRANCH_CL参数需要替换为分支创建更改列表(即提交给新分支的第一个更改列表)。作为一个具体的例子,用原始问题替换FIRST_BRANCH_CL130这个单行将输出123.

p4 describe -s FIRST_BRANCH_CL | perl -lne 'if(/^\.\.\. (.+#[0-9]+) .+$/) {print quotemeta $1}' | xargs p4 filelog -m1 | perl -lne 'if(/^\.\.\. \.\.\. branch from (.+#[0-9]+)/) {print quotemeta $1}' | xargs p4 fstat | perl -lne 'if(/^\.\.\. headChange (\d+)/) {$MaxCL=$1 if($1 > $MaxCL)} END {print $MaxCL}'
于 2014-07-16T12:17:26.800 回答
0

如果您使用 p4v 中的历史选项卡,它将显示针对分支提交的所有更改列表,因此请查看此

//project/1.0/...

一旦您找到了最早提交的变更列表,然后在该变更列表中的任何一个文件上查看它的修订图,这将向您显示该文件(和其余文件)从中集成的分支。

我会看看我是否可以用 p4 命令回来做同样的事情。

于 2010-11-07T09:08:39.737 回答
0

简短的回答

在 P4V 中使用修订图是回顾过去并调查集成历史。Perforce 网站上的视频

我已经成功地在具有数千个文件的分支上使用了修订图来跟踪特定更改何时集成到分支中。这就是为什么我推荐它并链接到一个培训视频,因为大多数人低估了它,因为他们不知道如何使用它。

长答案

... [删除]

更新:由于修订图显然不可行,您也许可以使用流程/策略解决此问题,即,当您执行集成时,在描述“Branched @ CL 123”中添加注释。在从主干线集成到发布线时,我们自己使用了这种方法。

于 2010-11-04T10:00:47.350 回答
0

更新的答案: 我认为这会奏效。尝试这个:

p4 interchanges from_branch  to_branch

这将显示从主分支到发布分支的未集成更改。我相信您可以使用顶部更改列表编号减 1 来找到您的源更改列表。 interchanges是一个未记录的 Perforce CLI 功能。要了解更多信息,请键入p4 help interchanges以了解有关此命令的更多信息。

同样,我认为这会奏效。可能有一些特殊情况不会,但这是我对一个棘手而重要的问题的最佳猜测。

于 2010-11-04T14:32:03.237 回答
0

“p4 集成”对我有用。在描述中查找“复制自”

于 2017-01-21T20:21:35.720 回答