Perforce 的类似于 SVN 中的 blame 命令是什么?

52

在命令行下,Perforce有没有类似于svn的blame命令的等效命令?p4 annotate命令不会显示用户名——只显示更改集号(没有祖先历史记录!)。

目前,我必须通过祖先追踪代码并与文件日志进行比较,但一定有更简单的方法——也许是一个自由开源软件实用工具?


2
这是一个非常重要的功能。Git和Subversion可以做到。已向Perforce开发人员提交了一个功能请求http://www.p4ideax.com/ideas/11922/add-a-command-p4-blame-similar-to-git-blame - Colonel Panic
6个回答

58

我对blame命令并不是很熟悉,但我猜你是在寻找改变特定代码行的人。最简单的方法是使用Perforce的“时间轴视图”,它可以从p4win和p4v中获得。

该工具使用annotate和其他命令,以便让你查看随着时间推移代码行的情况。你可以看到谁修改了哪些代码,何时将其插入或从代码行中移除等等。

但这不是一个命令行工具。我在帮助文档中简要检查了一下,好像没有一种直接从p4win或p4v调用的方法来启动时间轴视图。也许有吧... 我会进一步检查的...

编辑:我向支持部门咨询了一下,你可以通过以下方式从p4v启动timelapse视图:

p4v.exe -cmd "annotate //<path/to/file>"

希望对你有所帮助。


我同意TimeLapse视图在展示谁更改了哪一行方面做得很好。我经常使用它。 - Greg Whitfield
你如何在p4win中启动时间流逝视图? - cdleary
2
即使您使用P4Win,也必须安装P4V才能访问时间流逝功能。一旦完成安装,"Time-lapse View..."将出现在文件上下文菜单中。 - raven
7
你好。确切的语法是p4v -cmd "annotate <文件路径>"。路径可以是depot或local。 - Laur
2
请注意,p4v时间轴视图不会显示合并/集成的内容。因此,如果文件是从另一个分支复制/集成而来,则时间轴视图不会显示该历史记录。我刚刚发现了这一点 :)。 - Alexander Bird
将来参考:在p4v中选择工作区中的文件,然后右键单击该文件,您将获得“Time-Lapse View”选项,就在“修订图”下方。 - dillip

11

尝试看一下我认为可以帮助你获得大部分所需的几个工具:

1)由Bob Sidebotham和Jonathan Kamens编写的p4pr Perl脚本。

2)Emacs Perforce界面有一个名为'p4-print-with-rev-history'的命令(绑定到'C-x p V')。


6
我使用一个小脚本来进行责备。
#!/bin/bash

FILE="$1"
LINE="$2"

p4 annotate -cq "${FILE}" | sed "${LINE}q;d" | cut -f1 -d: | xargs p4 describe -s | sed -e '/Affected files/,$d'

您可以将其连接到一些编辑器上,这些编辑器将传递文件名和行号。

这里有一个稍微复杂一些的版本(链接)


4

通过p4v客户端,您可以在显示文件的所有视图(例如文件、变更列表等)上获得“Time-lapse View”上下文菜单。

时间流逝视图有相当多的选项,如单个版本、多个版本,以分析何时以及由谁更改了什么。


1

@alanw123:p4pr接近我所寻找的内容,但它不能跨越分支边界:

last if $type eq 'branch';

这就是我自己编写工具时遇到的主要问题——你无法(轻松地)知道行如何映射回分支自的文件。

1
请查看该帖子“跟踪以前分支的p4pr.perl的新版本”。因为Alan的链接已经失效,我已经更改了他的回答,使用了该版本。 - idbrii

1

p4 annotate 命令实际上可以使用 -I-i 命令在命令行上跟踪合并/集成和分支(但不能同时执行 :( ):

-I
Follow integrations into the file. If a line was introduced into the file by a merge, the source of the merge is indicated as the changelist that introduced the line. If that source was itself the result of an integration, that source will be used instead, and so on.
The use of the -I option implies the -c option. The -I option cannot be combined with -i.
-i
Follow file history across branches. If a file was created by branching, Perforce includes revisions up to the branch point.
The use of the -i option implies the -c option. The -i option cannot be combined with -I.

1
请注意,-I 也会跟随分支,但它使用不同的算法(-i 创建一个线性化的历史记录,跟随分支记录并对其进行正常注释,而 -I 则跟随整个“树”,跨越许多变体)。这些标志是互斥的,因为这两种方法不兼容,并且会产生不同的结果。 - Samwise

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接