【发布时间】:2011-03-14 03:04:43
【问题描述】:
如果我想删除的文件不属于工作区的一部分,我该如何从工作区中的目录中删除文件?
我的文件系统上有一个目录,其中包含从 perforce 获取的文件,但是在某些进程运行后,它会在这些目录中创建一些新文件。
是否有 perforce 命令可以删除这些生成的不属于我的工作区的文件?
【问题讨论】:
标签: perforce
如果我想删除的文件不属于工作区的一部分,我该如何从工作区中的目录中删除文件?
我的文件系统上有一个目录,其中包含从 perforce 获取的文件,但是在某些进程运行后,它会在这些目录中创建一些新文件。
是否有 perforce 命令可以删除这些生成的不属于我的工作区的文件?
【问题讨论】:
标签: perforce
Perforce 2013.2 有一个p4 status 命令,它是p4 reconcile -n 的别名
我不知道它是否在早期版本中可用。
【讨论】:
您还可以使用 p4v 和 p4 中的“协调离线工作”选项来完成此操作,而无需任何脚本。在 p4v 中,右键单击 Depot 视图中的任意目录,然后选择“Reconcile Offline Work”。
中间窗格将显示“本地文件不在仓库中”。您可以选择其中任何一个或全部,右键单击并选择“删除本地文件”。
简单!
【讨论】:
find /dir -empty -type d -delete 可以轻松解决这个问题。
如果使用 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中是否有等价物。
【讨论】:
这是我对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 以便删除。不过,在删除之前请小心检查列表。您很可能会在其中找到意想不到的东西。
【讨论】:
这在powershell中有点尴尬,因为p4将can't-find-file消息发送到错误流而不是std out。
ps > $error.clear()
ps > dir | %{p4 fstat -T "haveRev" $_} 2>$null
ps > $error | %{$_.Exception.ToString().Split()[1]} | %{del $_}
第二行应该会产生诸如"FILENAME.EXT - no such file(s)." 之类的错误,如果您在错误流中除了这些异常之外还有其他任何异常,请注意。
【讨论】:
您不能在 perforce 中修改/删除不属于您的工作空间的文件。您必须为此编写外部脚本。
【讨论】:
您可以使用p4 nothave 来确定不是由 perforce 管理的文件。根据p4 nothave 的输出,您可能可以执行p4 nothave | xargs rm,但请务必在运行之前检查p4 nothave 的结果(以免意外删除重要内容)。
【讨论】: