Batch file P4:我如何合并多个对“的”调用;p4集成;是否放入单个变更列表(在批处理文件中)?

Batch file P4:我如何合并多个对“的”调用;p4集成;是否放入单个变更列表(在批处理文件中)?,batch-file,perforce,Batch File,Perforce,我正在尝试编写一个集成多个分支的批处理文件。我想要一个包含所有更改的更改列表 我最初的想法是先创建变更列表,然后将其用于集成。但在我看来,这几乎是不可能的。 相反,您似乎需要先集成,然后创建变更列表。根据报告: 默认变更列表中打开的所有文件都将移动到新的变更列表中 我不喜欢这种方法,但问题是它甚至不起作用。我的批处理如下所示: p4 integrate //source1/... //target1/... p4 integrate //source2/... //target2/... p4

我正在尝试编写一个集成多个分支的批处理文件。我想要一个包含所有更改的更改列表

我最初的想法是先创建变更列表,然后将其用于集成。但在我看来,这几乎是不可能的。
相反,您似乎需要先集成,然后创建变更列表。根据报告:

默认变更列表中打开的所有文件都将移动到新的变更列表中

我不喜欢这种方法,但问题是它甚至不起作用。我的批处理如下所示:

p4 integrate //source1/... //target1/...
p4 integrate //source2/... //target2/...
p4 integrate //source3/... //target3/...

p4 resolve -am -c default

p4 change -i < changelistInfo.txt
p4集成//源1///target1/。。。
p4集成//源2///target2/。。。
p4集成//源3///目标3/。。。
p4解析-am-c默认值
p4变更-i
结果是我得到了一个新的但为空的变更列表,并且所有的集成仍然在默认的变更列表中。
这与帮助所说的形成了鲜明的对比


我完全被困在这里了。如何确保将所有集成移动到变更列表?如果可能,无需先将它们放入默认变更列表。

有多种方法可以将待处理的工作组合到您选择的变更列表中

由于您不希望首先在默认变更列表中工作,因此您应该这样做:

  • 首先,通过运行
    p4 change-i
  • 记下您的变更列表编号
    p4 change-i
    为您打印出来,或者您可以在事后通过执行类似于
    p4 changes-s pending-u Em1-m1的操作来获得它。假设是NNN
  • 接下来,通过运行
    p4 integrate-c NNN
    执行集成。包含“-c NNN”标志将告诉
    p4 integrate
    打开指定编号变更列表中的文件,而不是默认变更列表中的文件。在每个integrate命令之后,新打开的文件将累积到编号的变更列表中,您可以通过运行
    p4 opened
    进行确认
  • 然后您可以像以前一样运行
    p4 resolve
    。如果指定“-c”到
    p4 resolve
    ,请确保指定相同的变更列表编号“-c NNN”,但一般来说,我会说忽略-c”标志到
    p4 resolve

  • 在开发脚本时,我建议在开发和测试脚本时仔细阅读每个命令的输出,并在脚本中添加命令,如
    p4 opened
    p4 status
    ,以便查看工作区中每个命令的更改情况。

    创建挂起的更改列表时,使用“p4变更-o”为您生成的表格,例如:

    p4 change-o | sed-e“s//My Description/”| p4 change-i
    
    “p4 change-o”生成的变更列表表单包括变更列表的文件列表(默认情况下,这是默认变更列表中的所有文件),当“p4 change-i”读取表单时,它会查看该列表;如果其中没有文件,它将创建一个没有任何文件的变更列表

    如果您在Windows上编写批处理脚本,那么挑战性的部分是动态编辑表单,就像我在上面的示例中使用“sed”时所做的那样;我在Windows上,我通过在%path%中使用Cygwin工具(sed、grep、cut等)来处理类似的问题,这样我就可以从cmd提示符、批处理文件等运行类似命令。

    我的解决方案是基于,但我没有使用Cygwin工具。这是我的代码,完全是批处理的

    p4 integrate //source1/... //target1/...
    p4 integrate //source2/... //target2/...
    p4 integrate //source3/... //target3/...
    
    SETLOCAL=ENABLEDELAYEDEXPANSION
    
    p4 change -o > temp.txt
    
    for /f "tokens=1,* delims=]" %%a in (temp.txt) do (
        set foo=%%a
        set foo=!foo:^<enter description here^>=Merging!
        echo !foo! >> changelist.txt)
    
    p4 resolve -am -c default
    p4 change -i < changelist.txt
    
    del temp.txt
    del changelist.txt
    
    p4集成//源1///target1/。。。
    p4集成//源2///target2/。。。
    p4集成//源3///目标3/。。。
    SETLOCAL=启用延迟扩展
    p4更改-o>temp.txt
    对于(temp.txt)中的/f“tokens=1,*delims=]”%%a(
    设置foo=%%a
    设置foo=!foo:^=合并!
    echo!foo!>>changelist.txt)
    p4解析-am-c默认值
    p4变更-i
    我没有调用cygwin单行命令,而是迭代每一行来更改默认的描述文本。这是更多的代码,但具有相同的效果。

    它需要删除文件。但除此之外,与其他解决方案没有什么不同。

    我看到它打印出变更列表编号。但是我如何在脚本中获得这个数字呢。我不想手工输入正确的零钱号码。p4积分没有-m1这样的东西。我可以将它写入文件,解析文件,获取数字,我不知道脚本有多复杂…因此,我花了一些时间让它工作,因为我没有使用cygwin工具,而是找到了如何通过纯批处理读取/写入文件。我在另一个答案中公布了最终结果,但我接受了这个答案,因为这是解决问题的关键。顺便说一句,我将上面的评论标记为过时,因为它们只是多余的信息。
    p4 integrate //source1/... //target1/...
    p4 integrate //source2/... //target2/...
    p4 integrate //source3/... //target3/...
    
    SETLOCAL=ENABLEDELAYEDEXPANSION
    
    p4 change -o > temp.txt
    
    for /f "tokens=1,* delims=]" %%a in (temp.txt) do (
        set foo=%%a
        set foo=!foo:^<enter description here^>=Merging!
        echo !foo! >> changelist.txt)
    
    p4 resolve -am -c default
    p4 change -i < changelist.txt
    
    del temp.txt
    del changelist.txt