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

Posted

技术标签:

【中文标题】如何在 Perforce 树中查找未跟踪的文件? (模拟svn状态)【英文标题】:How to find untracked files in a Perforce tree? (analogue of svn status) 【发布时间】:2010-09-05 18:34:55 【问题描述】:

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

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

【问题讨论】:

我无法想象最常用的企业 SCM 工具怎么会缺少这个功能。可能他们所有的开发人员都只使用 GUI。 哦,大声哭泣!!!!接受的p4 status 不仅查找未跟踪的文件,实际上还开始跟踪它们。 IE。 p4 status 不是只读查询,正如人们从名称中所怀疑的那样,但实际上是一个更改内容的命令 - 而不是工作区文件。这不是状态命令应该做的,也不是svn status 应该做的。我能找到的最接近svn status 的是p4 reconcile -na - -a 表示“应该添加的文件”,-n 表示“实际上并没有改变任何东西”。 /// 我最初说的要强得多。 我恢复了***.com/questions/9642531/…,它被错误地标记为***.com/questions/9272/…的副本,作为新问题(What is the p4 command equivalent to something like git/hg/bzr/svn status? (Hint: not p4 status),并自己回答了。更好的欢迎 p4 reconcilep4 status 都慢得要命,而 git status 在 1-3 秒内完成。 【参考方案1】:

编辑:现在请使用p4 status。不再需要跳过篮球。请参阅@ColonelPanic 的answer。

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

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

您可以在此视图中右键单击文件并检出、添加甚至还原它们。

这是一个非常方便的工具,它救了我好几次。

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

【讨论】:

在这个问题中添加了一个powershell解决方案:***.com/questions/3217152/… 这是否会将每个文件与 repo 中的版本进行比较?我有一个大型仓库和一个缓慢的连接(在家工作时)。这可能需要很长时间! 我不认为这是一个完整的差异,但它并不快。 哦,大声哭泣!!!! p4 status 不只是查找未跟踪的文件,它实际上开始跟踪它们。 IE。 p4 status 不是只读查询,正如人们从名称中所怀疑的那样,但实际上是一个更改内容的命令 - 而不是工作区文件。这不是状态命令应该做的,也不是svn status 应该做的。我能找到的最接近svn status 的是p4 reconcile -na - -a 表示“应该添加的文件”,-n 表示“实际上并没有改变任何东西”。 /// 我最初说的要强得多。 p4 status 基本上是p4 reconcile -n 的同义词。也许你跑了p4 status -A,它是p4 reconcile的同义词?【参考方案2】:

在 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

【讨论】:

将标准错误重定向到标准输出将允许您执行额外的过滤或其他操作。例如,要查看 Java 文件的可滚动列表: find . -type f -print0 | xargs -0 p4 fstat 2>&1 >/dev/null | grep '\.java' |少 这在我的 60K 文件工作区中花费了非常长的时间。我编写了一个 python 脚本,它可以在 10 秒内完成相同的工作:p5。它还支持.p4ignore,可以预览和自动编辑未跟踪/更改/删除的文件。 @hamstergene,非常好! 写了一个small script,如果有人感兴趣的话(包括 dir 参数、最大深度参数和输出到 stdout)。 谢谢;我发现这很有用!请注意,这不处理符号链接 (find . -type l),并为强制添加的 P4 文件提供误导性输出,因为它们包含 @% 字符。但是,此类文件属于少数,因此在大多数情况下,手动审查这些边缘情况是可行的。【参考方案3】:

Unix 下:

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

这将打印出未添加到您的客户端或 Perforce 库中的文件列表。我用! -name '*~' 排除了以~结尾的文件。

【讨论】:

【参考方案4】:

啊,Perforce 经典之一 :) 是的,这真的很糟糕,默认命令中仍然没有简单的方法。

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

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

(在 nix 命令行中使用 'find . -type f -print')。

如果您想要一个物理列表(在控制台或文件中),那么您可以通过管道传输差异的结果(或者如果您还希望它们在更改列表中,则添加)。

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

【讨论】:

【参考方案5】:

svn statusgit status 的类似物吗?

是的,但是

从 Perforce 版本 2012.1 开始,有命令 p4 status 和 P4V 中的“协调离线工作”。但是,它们都非常缓慢。要排除不相关的文件,您需要为每个 https://***.com/a/13126496/284795 编写一个 p4ignore.txt 文件

【讨论】:

自 2012.1 版本以来,p4 status 的性能有了几项改进。如果您因性能问题而一直远离p4 status,则可能值得再次对其进行测试以了解它现在的行为。【参考方案6】:

2021-07-16:此答案可能已过时。

我有理由确定它在 2016 年是准确的,无论我使用的是什么版本的 Perforce(不一定是最新的)。但似乎这个问题或设计限制已在 Perforce 的后续版本中得到纠正。我不知道堆栈溢出的礼仪是什么——这个答案应该被删除吗?

2016 年回答

我觉得有必要添加一个答案,因为已接受的答案和其他一些答案存在我认为的一个重大问题:他们不理解只读查询命令和生成的命令之间的区别变化。

我不希望这个答案有任何功劳,但我希望通过遵循公认但恕我直言不正确的答案,它可以帮助其他人避免浪费时间和犯错误。

---+ 简介

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

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

-n 说“不做任何改变”——即试运行。 (虽然消息可能会说“opened for add”,但心理上你必须将其解释为“would be opens for add if not -n”)

可能是查找脱机时进行的所有本地更改的最便捷方式 - 不仅包括可能需要添加的文件,还包括可能需要删除的文件,或者在没有通过 @987654324 打开进行编辑的情况下已更改的文件@,是p4 reconcile -n

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

---+警告

p4 status 不是其他版本控制系统上状态命令的对应物。

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

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

除了本地工作区与仓库路径名的一些细节之外,似乎没有理由使用p4 status 而不是p4 reconcile -n

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

---+ P4V图形界面

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

【讨论】:

p4 状态似乎没有添加文件。它似乎工作起来,并被记录为“reconcile -n”。你确定它会改变吗?【参考方案7】:

我在我的工具中使用以下内容来备份工作区中与存储库不同的任何文件(对于 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) 不包括目录 (/AD)。 “sed”将危险字符更改为“%xx”形式(类似于 html),“p4 have”命令会检查这一点list ("-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 非常快! find/xargs 内存不足且运行缓慢。添加到 .bat 文件时调用双倍 %。【参考方案8】:

也可以从 P4Win 使用左侧视图面板上的“本地文件不在 Depot 中”选项。

我不怎么用P4V,但是我觉得相当于在Workspace view tab.p4 help fstat的filter下拉列表中选择“Hide Local Workspace Files”

在 P4V 2015.1 中,您会在过滤器按钮下找到这些选项,如下所示:

【讨论】:

这只会显示当前目录下的文件,很遗憾:(【参考方案9】:

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

【讨论】:

【参考方案10】:

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

p4 status p4 opened p4 diff -ds

【讨论】:

【参考方案11】:

我没有足够的声望点来发表评论,但罗斯的解决方案还列出了可以添加的文件。你可能想用他的回答来清理你的工作空间。

以下使用p4 fstat(感谢 Mark Harrison)而不是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"

===贾克

【讨论】:

【参考方案12】:

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

【讨论】:

【参考方案13】:

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)。

【讨论】:

请不要只是抛出一些没有任何解释的代码作为答案,而是添加一些解释以帮助 OP 理解代码并学习一些东西。 :)【参考方案14】:

我需要可以在 Linux、Mac 或 Windows 上运行的东西。所以我为它写了一个 Python 脚本。基本思想是遍历文件并在每个文件上执行p4 fstat。 (当然忽略依赖和 tmp 文件夹)

你可以在这里找到它:https://gist.github.com/givanse/8c69f55f8243733702cf7bcb0e9290a9

【讨论】:

【参考方案15】:

此命令可以为您提供需要添加、编辑或删除的文件列表: p4 状态 -aed ... 你也可以单独使用它们 p4 状态 -a ... p4 状态 -e ... p4 状态 -d ...

【讨论】:

【参考方案16】:

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

【讨论】:

以上是关于如何在 Perforce 树中查找未跟踪的文件? (模拟svn状态)的主要内容,如果未能解决你的问题,请参考以下文章

如何从当前 Git 工作树中删除本地(未跟踪)文件

Perforce ( P4 ) 将树中的特定版本移动到树的顶部

Perforce P4V 将新文件添加到软件仓库

使用 Maven 发布插件时在 Perforce 中锁定源文件

Jenkins Perforce 插件未从 Perforce 签出代码

Perforce 索赔文件在不同时会有所不同