Perforce 是否可以使用一组变更列表创建修补程序?

Perforce 是否可以使用一组变更列表创建修补程序?,perforce,Perforce,问题:2个项目共享主干并正在更新一些相同的文件。现在需要发布一个项目,因此在项目开始之前从检查点创建了一个新分支 我有一个列表,上面只有我在主线上的变更列表编号。使用它,我可以使用带有一系列“p4 descripe#”命令的脚本生成一个列表更改文件和diff输出 我是否可以重新格式化该输出并以某种方式将其应用于新分支?Perforce将允许您挑选变更列表进行集成,这可能比尝试生成和应用补丁更容易。Perforce将跟踪您在何处集成了哪些修订,这可能会使将来的集成更容易 假设您以前有一个主干: /

问题:2个项目共享主干并正在更新一些相同的文件。现在需要发布一个项目,因此在项目开始之前从检查点创建了一个新分支

我有一个列表,上面只有我在主线上的变更列表编号。使用它,我可以使用带有一系列“p4 descripe#”命令的脚本生成一个列表更改文件和diff输出


我是否可以重新格式化该输出并以某种方式将其应用于新分支?

Perforce将允许您挑选变更列表进行集成,这可能比尝试生成和应用补丁更容易。Perforce将跟踪您在何处集成了哪些修订,这可能会使将来的集成更容易

假设您以前有一个主干:

//depot/mycode/trunk
您在那里签入了所有更改。您在过去的某个时候将主干分支到:

//depot/mycode/rel
在主干上有一个要合并的变更列表列表。从映射rel的客户端规范中,集成每个变更列表:

p4 integrate //depot/mycode/trunk/...@1234,1234 //depot/mycode/rel/...
其中,
1234
是变更列表编号。每次集成后解决。如果您能找到这样做的优点,那么您可能还希望在集成过程中的各个检查点构建、测试和提交集成。(Perforce可以在每次提交时处理多个集成,但如果您犯了错误,则需要恢复到签入的最后一个版本,并重新执行中间集成和解析。)

响应标题:“是否可以使用一组变更列表创建修补程序?” 对


然后可以使用/tmp/cln.patch作为补丁实用程序的输入。这里,“cln”是您要为其创建修补程序的已提交更改列表编号。

我刚刚花了两个小时来解决这个问题。使用cygwin
patch
,我不得不咀嚼路径,直到它们被识别出来

最后,魔法咒语看起来是这样的(断线):

即:

  • 使用
    p4 diff2
    在我关心的两个版本之间获得仓库部分的统一差异(
    -u
    )。第二个变更列表是我想要的第一个变更列表之前的变更列表,否则它不包括在差异中
  • 使用
    sed
    //depot/
    更改为
    E:/Source/
    ,这是我的工作区所在的位置
  • 将前斜杠改为双反斜杠(这似乎可以让它工作)
  • 通过
    补丁
    导入结果
  • Cygwin
    patch
    足够聪明,可以将文件签出Perforce,但我不知道如何让它以静默方式完成。它会提示从Perforce with lock?获取文件“e:\Source\foo\whatever”

    这是在PowerShell上运行的Cygwin的
    p4
    Version2010.1,这是一个相当新的安装

    哦,在这之后,
    patch
    写出了Unix风格的行尾,所以我用
    u2d
    来修复它们。

    p4 descripe-S-du


    在我看来,这是最简短的命令。

    如果我是唯一一个签入的人,为什么我需要解决这个问题?集成变更列表不只是为了提交而修改的代码中的一个因素吗?如果它查看整个文件,我可以描述冲突。Perforce使您在每次集成时都能解决冲突,以防您需要手动解决任何冲突。在您的情况下,如果新的变更列表更改了以前的变更列表中添加的代码,则会发生冲突。请注意,
    p4 diff2
    不会为添加或删除的文件输出diff,因此需要对这些文件进行特殊处理,以获得
    patch
    来添加或删除它们。@jamesdlin,比如说?@DanM。您必须手动将添加或删除的文件与空文件区分开来。更具体地说,对于添加的文件,您必须手动运行
    diff-u EMPTY\u file added\u file
    。对于已删除的文件,您必须获得文件的先前版本,并执行
    diff-u OLD_file EMPTY_file
    @DanM。此外,为正确起见,空文件的时间戳应为0(1970-01-01T00:00:00Z)(或者对不存在的文件而不是空文件使用
    diff-N
    )。有关详细信息,请参阅“您可以通过…创建文件”。@jamesdlin没有简单的方法来自动执行此操作?有关使用
    p4 diff2
    的警告,请参阅我的评论。
    p4 diff2 -u //path_to_your_sources/...@cln_minus_1 //path_to_your_sources/...@cln > /tmp/cln.patch.
    
    p4 diff2 -u //depot/foo/main/...@100003 //depot/foo/main/...@100000 |
        sed 's@//depot/@E:/Source/@g' |
        sed '/^+++\|---/s@/@\\@g' |
        patch