如何在Perforce树中查找未跟踪的文件?(svn状态的类似物)


87

有人拥有脚本或别名来在Perforce树中查找未跟踪(实际上是未添加)的文件吗?

编辑:我更新了对此的可接受的答案,因为看起来P4V在2009年1月的发行版中对此添加了支持。


11
我无法想象最常用的企业SCM工具会缺少此功能。大概所有的开发人员都只使用GUI。
sorin

3
噢,天呐!!!!接受的p4 status不仅是查找未跟踪的文件,它实际上还可以开始跟踪它们。即,p4 status这不是一个只读查询,就像从名称中可能会怀疑的那样,但实际上是一个更改内容的命令-而不是工作区文件。这不是状态命令应该做什么,也不是做什么svn status。我能找到的最接近的内容svn statusp4 reconcile -na--a表示“应添加的文件”,-n表示“实际上没有更改任何内容”。///我最初说的要强得多。
Krazy Glew,


这两个p4 reconcilep4 status是缓慢的地狱,而git status最终在1-3秒执行。
zwcloud

Answers:


81

编辑:请立即使用p4 status。不再需要跳铁圈了。参见@ColonelPanic的答案

在2009年1月版的P4V中,您可以右键单击工作区树中的任何文件夹,然后单击“协调离线工作...”。

这将进行一些处理,然后显示未检出但与软件仓库版本有所不同或根本未检入的文件的拆分树视图。它甚至可能提出其他一些类别。

您可以在此视图中右键单击文件,然后将它们检出,添加或什至还原它们。

这是一个非常方便的工具,已经节省了我几次。

编辑:啊,这个问题专门询问了脚本,但是为了以防万一,我将在这里留下这个答案。


添加在这个问题上的PowerShell的解决方案:stackoverflow.com/questions/3217152/...
tenpn

这会将每个文件与仓库中的版本进行比较吗?我的仓库很大,连接速度很慢(在家工作时)。这可能要一辈子!
gdw2 2012年

我不认为这是一个完全的区别,但这并不快。
tenpn 2012年

10
噢,天呐!!!! p4 status不仅可以查找未跟踪的文件,它还可以开始跟踪它们。即,p4 status这不是一个只读查询,就像从名称中可能会怀疑的那样,但实际上是一个更改内容的命令-而不是工作区文件。这不是状态命令应该做什么,也不是做什么svn status。我能找到的最接近的东西svn statusp4 reconcile -na--a表示“应添加的文件”,-n表示“实际上不更改任何内容”。///我最初说的要强得多。
Krazy Glew

1
p4 status基本上是的同义词p4 reconcile -n。也许您跑了p4 status -A,这是的同义词p4 reconcile
Samwise

50

在linux上,或者在Windows上安装了gnu-tools:

find . -type f -print0 | xargs -0 p4 fstat >/dev/null

这将显示每个未解释文件的错误消息。如果要捕获该输出:

find . -type f -print0 | xargs -0 p4 fstat >/dev/null 2>mylogfile

1
将stderr重定向到stdout将允许您执行其他过滤或其他操作。例如,要查看Java文件的可滚动列表:find。型f -print0 | xargs -0 p4 fstat 2>&1> / dev / null | grep'\ .java'| 少
乔恩·纳达尔

2
这在我的6万个文件的工作空间上耗时很长。我写了一个python脚本,在10秒内完成了相同的工作:p5。它还支持.p4ignore并可以预览和自动编辑未跟踪/更改/删除的文件。
hamstergene

@hamstergene,非常好!
马克·哈里森

编写了一个小型脚本,该脚本可以在任何人感兴趣的情况下(包括dir参数,最大深度参数和输出到stdout)准确地执行此操作。
Arnon Zilca 2015年

谢谢; 我发现这很有用!请注意,这不会处理符号链接(find . -type l),并且会为强制添加的P4文件提供误导性输出,因为它们包含@%字符。但是,此类文件很少,因此在大多数情况下可以手动检查这些极端情况。
CJBS 2015年

19

在Unix下:

find -type f ! -name '*~' -print0| xargs -0 p4 fstat 2>&1|awk '/no such file/{print $1}'

这将打印出客户端或Perforce软件仓库中未添加的文件列表。我曾经! -name '*~'排除以〜结尾的文件。


12

啊,Perforce的经典作品之一:)是的,这真让人感到遗憾,默认命令中还没有简便的方法。

最简单的方法是运行命令以找到客户端根目录下的所有文件,然后尝试将它们添加到软件仓库中。最后,您将获得所有新文件的更改列表,而现有文件将被忽略。

例如dir / s / b / AD | p4 -x-添加

(从nix命令行使用'find。-type f -print')。

如果需要物理列表(在控制台或文件中),则可以通过管道传递差异结果(如果需要,也可以添加它们在变更列表中)。

如果在P4Win中运行此命令,则可以使用$ r替换当前工作区的客户端根目录。


11

是否有svn status或的类似物git status

是的,但是

从Perforce 2012.1版开始,该命令已存在,p4 status并且在P4V中“协调脱机工作”。但是,它们都很慢。要排除不相关的文件,您需要p4ignore.txt按照https://stackoverflow.com/a/13126496/284795编写文件


1
p4 status自2012.1版本以来,已对性能进行了一些改进。如果您p4 status出于性能方面的考虑而远离,那么可能值得再次对其进行测试,以了解它现在的表现。
Bryan Pendleton

7

我觉得不得不添加一个答案,因为被接受的答案以及其他一些答案都存在我认为的重大问题:他们不理解只读查询命令与进行更改的命令之间的区别。

我不希望这个答案有什么用,但是我希望它可以帮助其他人避免浪费时间并遵循公认的但恕我直言的错误答案。

---简介

在perforce工作区中查找所有未跟踪文件的最便捷方法可能是p4 reconcile -na

-a 说:“给我不在存储库中的文件,即应添加的文件”。

-n说“不做任何改变”-即空转。(尽管消息可能会显示“已打开以供添加”,但从精神上讲,您必须将其解释为“如果没有-n则将被打开以供添加”)

也许最便捷的方式找到离线时所做的所有本地更改-不只是文件可能需要增加,而且文件可能需要被删除,或已不被打开,通过编辑被改变p4 edit,是p4 reconcile -n

提供了几个答案脚本,通常涉及p4 fstat。虽然我尚未验证所有这些脚本,但我经常使用类似的脚本来弥补perforce命令的不足,例如p4 reconcile -n-例如,我经常发现我想要本地路径,而不是Perforce软件仓库路径或工作区路径。

---警告

p4 status 与其他版本控制系统上的状态命令不匹配。

p4 status不是只读查询。p4 status实际上找到与之相同的更改,p4 reconcile并将其添加到存储库中。p4 status似乎没有像这样的-n空运行选项p4 reconcile

如果这样做p4 status,请查看文件并认为“哦,我不需要那些”,然后,p4 revert如果要继续在同一工作空间中进行编辑,则必须使用它们。否则,p4 status将在下一次检查添加到变更集的变更。

除了本地工作空间与软件仓库路径名的某些详细信息外,似乎几乎没有理由使用p4 status而不是p4 reconcile -n

我只能想象,为非只读命令选择“状态”的人只能使用有限的英语和其他版本控制工具命令。

--- P4VGUI

在GUI中p4v,reconcile命令查找可能需要添加,删除或打开以进行编辑的本地更改。幸运的是,默认情况下它不会将它们添加到变更列表中。但是如果您不想提交更改,您仍然可能要在检查协调窗口后小心关闭它。


p4状态似乎没有添加文件。它看起来像,并且记录为“ reconcile -n”。您确定它会改变一切吗?
kdubs

4

我在工具中使用以下内容来备份工作区中与存储库不同的所有文件(对于Windows)。它可以处理一些Perforce不太喜欢的奇怪情况,例如嵌入的空格,星号,百分比和井号:

dir /S /B /A-D | sed -e "s/%/%25/g" -e "s/@/%40/g" -e "s/#/%23/g" -e "s/\*/%2A/g" | p4 -x- have 1>NUL:

dir / S / B / AD ” 以“裸”格式(/ B)列出此文件夹(/ S)或以下的所有文件(/ S),但目录(/ AD)除外。“ sed ”将危险字符更改为其“ %xx ”形式(例如HTML),并且“ p4 have ”命令对照服务器丢弃此列表(“ -x- ”)以丢弃其实际上位于存储库中的文件的任何内容(“ 1> NUL: ”)。结果是一串类似:

Z:\No_Backup\Workspaces\full\depot\Projects\Archerfish\Portal\Main\admin\html\images\nav\navxx_background.gif - file(s) not on client.

等等!


这是一个很棒的解决方案,并且仍适用于P4版本2015.1
Rian Sanderson

非常快!find / xargs内存不足且运行缓慢。当添加到.bat文件时,请调用两倍的%s。
kevinf

4

或者,从P4Win中,使用左侧视图面板上的“本地文件不在仓库中”选项。

我使用P4V的次数不多,但是我认为这等效于在“工作区视图”选项卡的过滤器下拉列表中选择“隐藏本地工作区文件”。p4help fstat

在P4V 2015.1中,您可以在过滤器按钮下找到这些选项,如下所示: 在此处输入图片说明


可悲的是,这仅显示当前目录下的文件:(
JP

2

Quick'n Dirty:在p4v中,右键单击有问题的文件夹,并将其下的所有文件添加到新的更改列表中。更改列表现在将包含所有当前不属于软件仓库的文件。


1

以下命令产生类似状态的输出,但是没有一个命令等效于svn statusgit status,提供了每个文件状态的单行摘要:

  • p4 status
  • p4 opened
  • p4 diff -ds

0

我没有足够的信誉积分可以发表评论,但是Ross的解决方案还列出了可以添加的文件。你可能希望使用他的回答来清洁您的工作空间。

以下用途p4 fstat(感谢马克·哈里森)来代替p4 have,并列出不在库中的文件不开放的插件。

dir /S /B /A-D | sed -e "s/%/%25/g" -e "s/@/%40/g" -e "s/#/%23/g" -e "s/\*/%2A/g" | p4 -x- fstat 2>&1 | sed -n -e "s/ - no such file[(]s[)]\.$//gp"

===杰克


0

快速的方法,但很少正统。如果代码库不经常添加新文件/更改视图,则可以在结帐之外创建本地“ git”存储库。通过干净的perforce同步,git init,在本地添加和提交所有文件。Git状态很快,将显示以前未提交的文件。


0

p4 fstat命令可让您测试工作空间中是否存在文件,并结合使用find以查找文件,如以下Perl示例所示:

// throw the output of p4 fstat to a 'output file'
// find:
//  -type f  :-  only look at files,
//  -print0  :-  terminate strings with \0s to support filenames with spaces
// xargs:
//  Groups its input into command lines,
//  -0       :-  read input strings terminated with \0s
// p4:
//  fstat    :-  fetch workspace stat on files

my $status=system "(find . -type f -print0 | xargs -0 p4 fstat > /dev/null) >& $outputFile";

// read output file
open F1, $outputFile or die "$!\n";

// iterate over all the lines in F1
while (<F1>) {
  // remove trailing whitespace
  chomp $_;

  // grep lines which has 'no such file' or 'not in client'
  if($_ =~ m/no such file/ || $_ =~ m/not in client/){

     // Remove the content after '-'
     $_=~ s/-\s.*//g;

     // below line is optional. Check ur output file for more clarity.
     $_=~ s/^.\///g;

     print "$_\n";
  }
}

close F1;

或者你可以使用 p4 reconcile -n -m ...

如果已“打开以删除”,则已从工作空间中将其删除。请注意,以上命令在预览模式(-n)中运行。


1
请不要仅仅抛出一些没有任何解释的代码作为答案,而是添加一些解释以帮助OP理解代码并学到一些东西。:)
马库斯


-1

在P4V中,在“查看”菜单项下选择“文件夹中的文件”,这将在右窗格中弹出一个新选项卡。选项卡的最右边是一个小图标,它打开一个带有2个图标的窗口,称为“文件夹中的文件”。选择看起来像漏斗的左侧图标,您将看到几个选项。选择“显示不在仓库中的项目”,文件夹中的所有文件都会显示。然后,右键单击要添加的文件,然后选择“标记为添加...”。您可以在“待处理”标签中验证它是否存在。只需照常提交(Ctrl + S)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.