如何获取待处理的 Perforce 更改列表中所有文件的差异?

Posted

技术标签:

【中文标题】如何获取待处理的 Perforce 更改列表中所有文件的差异?【英文标题】:How do I get diffs of all the files in a pending Perforce changelist? 【发布时间】:2010-11-10 10:19:09 【问题描述】:

我想获取特定待处理更改列表中文件的差异。我希望我能做到这一点:

p4 diff -c 999

有人可以帮我串起一些 csh 魔法来实现这一点吗?

也许将p4 opened -c 999 的输出通过管道传送到p4 diff

【问题讨论】:

搁置待定更改列表中的更改,然后运行p4 describe -S -du 999 【参考方案1】:

对于未搁置的更改(更改仍未在仓库中)

p4 opened -c 999 | awk 'BEGIN  FS = "#"  //  print "p4 diff " $1 ' | bash

对于搁置的更改(仓库中的更改(p4 shelve -c 999)

p4 describe -S -du3 -O 999

【讨论】:

【参考方案2】:

对于在 Windows cmd shell 中工作的单行程序,试试这个:

for /f "usebackq delims=#" %F in (`p4 opened -c 999`) do @p4 diff %F

要在批处理文件中执行此操作,您需要使用 %%F 而不仅仅是 %F

请注意,如果您安装了类似 unix 的实用程序包(例如 cygwin 或 unixutils),上述某些解决方案将在 Windows 下运行,但此单行没有外部依赖项。

【讨论】:

【参考方案3】:

搁置待定更改列表中的更改,然后运行

p4 describe -S -du 999

【讨论】:

以前没听说过搁置。试过这个,效果很好。 这行得通,但它应该是可能的,而不必搁置任何东西。 Perforce 需要进行可用性测试。 另外,无法应用生成的补丁文件。它与 unix 补丁命令“仅在补丁输入中找到垃圾”不兼容,并且没有任何特殊的 p4 patch 命令,如您所料。【参考方案4】:

解决方案

p4 opened -c 999 | sed -e 's/#.*//' | p4 -x - diff

说明

p4 -x 为您提供类似xargs 的能力,而无需使用xargs。来自p4 help utils

-x 标志指示 p4 从 指定的文件。如果指定“-”,则读取标准输入。

因此,您几乎可以按照问题中的建议“获取 p4 opens -c 999 的输出并将其通过管道传输到 p4 diff”。一个棘手的部分是p4 opened 的输出在每个打开文件的名称之后包含修订号和解释性文本,例如

//depot/example#123 - edit change 999 (text) by day@office
//depot/new-example#1 - add change 999 (text) by day@office

但是我们可以通过一个简单的sed -e 's/#.*//' 来运行它,以剥离从# 开始的所有内容,只留下路径:

//depot/example
//depot/new-example

由于p4 -x -,然后可以从标准输入中使用并馈送到p4 diff

如果您在任何文件的名称中都有#,那么您需要更聪明地使用sed 命令。并去看心理医生。

【讨论】:

jwd:确实如此,但我认为其他任何解决方案都不适用于添加的文件...问题是p4 diff newfile 本身只会说//depot/newfile - file(s) not opened for edit. 不是很有帮助。 这与我首选的 $P4DIFF 工具 Kaleidoscope 配合得很好。【参考方案5】:

p4 描述 999 | grep '#' |剪切 -d"#" -f1|剪切 -d" " -f2 | xargs p4 差异

【讨论】:

据我所知,这不适用于待处理的更改列表。 它对我来说确实适用于一个非常流畅的待更改列表。我什至为那长长的管道创建了一个别名。谢谢! 请注意,这不适用于添加或删除的文件。【参考方案6】:

我使用了与 Mark 类似的方法,但我使用了 Perl 而不是 Awk,以及一个 shell 函数(在 zsh 中):

p4dc()  p4 opened -c $* | perl -ne 's/#.*//; system("p4", "diff", $_)' 

请注意,除了更改列表名称/编号之外,您还可以提供文件路径:

p4dc default | less
p4dc default ... | less

【讨论】:

【参考方案7】:

你可以像这样使用 shell 脚本:

#!/bin/sh

list=`p4 opened -c $1 | cut -d# -f1`

for file in $list ;
do
  p4 diff -dwbu $file
done

使用更改列表编号调用它,您将在标准输出中获得补丁。

【讨论】:

是否可以在 Windows 批处理文件中创建类似的内容?谢谢【参考方案8】:

以上回答了您的问题,但是,如果将磁贴读取为更改列表上的目录差异,则可以通过以下方式回答:

p4 filelog ... | awk '
BEGIN FS="[ /]";tc=999
/^\/\// fn=$NF;o=1;if (system("test -w " fn)) h=0; else h=""
/^\.\.\.\ \#/ if (h==0) h=$2;
  if ($4<=tc && o==1) print "p4 diff -db -dw " fn h " " fn $2 " ;#"  $4;o=0' \
| sh

这会将目录中的所有文件与更改列表 999 进行比较,如果已签出则使用“拥有”版本,否则使用最新版本。

这是用 GNU Awk 3.1.3 测试的

【讨论】:

【参考方案9】:

最简单的方法是在 p4v 或 p4win 中,但这不是你要问的。

试试这个:

p4 opened -c 999 | awk 'BEGIN  FS = "#"  //  print "p4 diff " $1 ' | csh

当然,你需要确保子 shell 的路径中有 p4,并且 $P4CLIENT 等都设置好了。

【讨论】:

太棒了!但是有一个问题,如何将 999 替换为要在别名中使用的变量。据我所知,但我对别名参数和转义规则的理解是有限的。别名 p4diffchange 'p4 打开 -c $1 | awk 'BEGIN FS = "#" // print "p4 diff " $2 ' | csh'; 不要使用别名,把它放在一个shell脚本中,使用脚本的位置参数。 多么痛苦!为什么 Perforce 不支持使用 p4 describe 显示待处理更改列表的差异? 请注意,这不适用于添加或删除的文件。

以上是关于如何获取待处理的 Perforce 更改列表中所有文件的差异?的主要内容,如果未能解决你的问题,请参考以下文章

将 Perforce scm 配置到 maven 项目中以获取最新的更改列表

确定用于在 perforce 中提交新更改的更改列表

Perforce resolve 无法正确处理重命名

Perforce挂起的更改列表差异脚本

Perforce:如何将稍后的提交应用于同步到早期版本的工作区?

TFS API 待处理项目、排除列表、包含列表