40

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

p4 diff -c 999

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

也许将输出p4 opened -c 999和管道传输到p4 diff

4

9 回答 9

26

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

p4 describe -S -du 999
于 2012-11-07T23:57:50.210 回答
20

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

试试这个:

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

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

于 2009-07-13T19:56:02.247 回答
16

解决方案

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 diff感谢p4 -x -.

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

于 2012-09-07T16:36:04.540 回答
8

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

于 2011-10-13T13:31:58.943 回答
6

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

#!/bin/sh

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

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

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

于 2010-11-04T22:43:41.057 回答
1

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

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

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

p4dc default | less
p4dc default ... | less
于 2011-05-20T21:24:04.630 回答
1

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

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

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

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

于 2018-06-08T21:33:02.527 回答
0

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

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 测试的

于 2010-04-02T05:33:13.430 回答
0

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

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

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

p4 describe -S -du3 -O 999
于 2020-06-02T18:34:35.990 回答