Perforce 实际上,如果文件不是工作区的一部分,如何从工作区的目录中删除文件?

Perforce 实际上,如果文件不是工作区的一部分,如何从工作区的目录中删除文件?,perforce,Perforce,实际上,如果要删除的文件不是工作区的一部分,如何从工作区的目录中删除文件 我的文件系统中有一个目录,其中包含从perforce获取的文件,但在某些进程运行后,它会在这些目录中创建一些新文件 是否有perforce命令来删除这些生成的不属于我的工作区的文件?您可以使用p4 nothave来确定perforce未管理的文件。根据p4 nothave的输出,您可能可以执行p4 nothave | xargs rm,但在运行该命令之前,请确保检查p4 nothave的结果(以便您不会意外删除重要的内容)

实际上,如果要删除的文件不是工作区的一部分,如何从工作区的目录中删除文件

我的文件系统中有一个目录,其中包含从perforce获取的文件,但在某些进程运行后,它会在这些目录中创建一些新文件


是否有perforce命令来删除这些生成的不属于我的工作区的文件?

您可以使用
p4 nothave
来确定perforce未管理的文件。根据
p4 nothave
的输出,您可能可以执行
p4 nothave | xargs rm
,但在运行该命令之前,请确保检查
p4 nothave
的结果(以便您不会意外删除重要的内容)。

您无法从Performce中修改/删除不属于工作区的文件。您必须为此编写外部脚本。

这在powershell中有点尴尬,因为p4将找不到文件消息发送到错误流,而不是std out

ps > $error.clear()
ps > dir | %{p4 fstat -T "haveRev" $_} 2>$null
ps > $error | %{$_.Exception.ToString().Split()[1]} | %{del $_}

第二行应该会产生错误,例如
“FILENAME.EXT-没有这样的文件。”
如果错误流中没有这些异常,那么它可能有点不稳定,所以要小心。

这是我快速实现的
p4 nothave

#!/bin/bash
#
# List files present, but not in perforce.

tmpd="$(mktemp -d /tmp/nothave.XXXXXXXX)"
trap "rm -rf $tmpd" EXIT HUP INT QUIT TERM

p4 have | awk -F' - ' '{print $2}' | sort >$tmpd/have.txt

root=$(p4 info | awk -F': ' '$1=="Client root"{print $2}')
find $root -type f | sort >$tmpd/find.txt

comm -13 $tmpd/have.txt $tmpd/find.txt

这将生成一个文件列表,然后可以通过管道将其导入
xargs rm
,以便删除。但在删除之前,请注意检查列表。您可能会在其中找到一些意想不到的东西。

如果使用Linux/Unix,在Bourne shell系列中,您可以键入

find . -type f | p4 -x- files 2>&1| grep "no such file" | cut -f1 -d" " | xargs rm
类似地,对于符号链接,键入

find . -type l | p4 -x- files 2>&1| grep "no such file" | cut -f1 -d" " | xargs rm
上面是字母“el”,而不是“one”

我不知道Windows中是否有等效版本。

您也可以使用p4v和p4中的“协调脱机工作”选项来完成此操作,而无需编写任何脚本。在p4v中,右键单击Depot view中的任何目录,然后选择“协调脱机工作”

中间窗格将显示“本地文件不在仓库中”。您可以选择其中任何一个或全部,右键单击并选择“删除本地文件”


轻松点

Perforce 2013.2有一个
p4 status
命令,它是
p4协调-n的别名


我不知道它是否在早期版本中可用。

奇怪的是,我的p4 exe没有任何版本。这只是linux版本中的可能吗?p4 nothave不存在。你必须用find、“p4 have”和comm(1)来伪造它。这个答案怎么能被接受呢?我将投反对票,希望op能恢复正确。结果证明,这是我的雇主使用的特定实现中的非标准扩展。删除答案。显然,我无法删除此内容,因为此内容已被接受为答案@Matt,你能取消标记/选择一个不同的答案,这样我就可以删除它吗?…还在学习powershell,所以如果有更快的方法,请告诉我。你可以在powershell中重定向stderr,它会很好地将错误包装在ErrorRecords中(将“-r”添加到dir以搜索整个树):dir |%{p4.exe fstat$|.FullName 2>&1}?{$\-是[System.Management.Automation.ErrorRecord]}{$\.Exception.ToString().Split()[1]}{del$\}这个答案在linux上对我不起作用。“p4文件…”未列出不属于工作区的任何文件。我认为原来的问题被误解了。试试看:“mkdir tmp;cd tmp;touch not_in_workspace;p4 files…”我想他用了两种不同的方式来使用“workspace”。他试图删除的文件在他的工作区内,但没有签入(Performce将其他文件放在有问题的文件旁边的事实证明了这一点)。这很有效-谢谢!我注意到这个方法在本地系统上保留了所有生成的空目录(如果有的话)。在基于Unix的系统上,
find/dir-empty-typed-delete
可以很容易地解决这个问题。