【问题标题】:In perforce how can I delete files from a directory in my workspace where the files are not part of the workspace?在perforce中,如何从我的工作区中的文件不属于工作区的目录中删除文件?
【发布时间】:2011-03-14 03:04:43
【问题描述】:

如果我想删除的文件不属于工作区的一部分,我该如何从工作区中的目录中删除文件?

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

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

【问题讨论】:

    标签: perforce


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      您还可以使用 p4v 和 p4 中的“协调离线工作”选项来完成此操作,而无需任何脚本。在 p4v 中,右键单击 Depot 视图中的任意目录,然后选择“Reconcile Offline Work”。

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

      简单!

      【讨论】:

      • 这很好用 - 谢谢!我注意到此方法将所有生成的空目录(如果有)留在本地系统上。
      • 在基于 Unix 的系统上 find /dir -empty -type d -delete 可以轻松解决这个问题。
      【解决方案3】:

      如果使用 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中是否有等价物。

      【讨论】:

      • 这个答案在 linux 上对我不起作用。 “p4 files ...”没有列出任何不属于工作区的文件。我认为最初的问题被误解了。试试看:“mkdir tmp; cd tmp; touch not_in_workspace; p4 files ...”
      【解决方案4】:

      这是我对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 以便删除。不过,在删除之前请小心检查列表。您很可能会在其中找到意想不到的东西。

      【讨论】:

        【解决方案5】:

        这在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)." 之类的错误,如果您在错误流中除了这些异常之外还有其他任何异常,请注意。

        【讨论】:

        • ...还在学习powershell,如果有更快的方法,请告诉我。
        • 您可以在 PowerShell 中重定向 stderr,它会很好地将错误包装在 ErrorRecords 中(将“-r”添加到 dir 以搜索整个树): dir | % {p4.exe fstat $_.FullName 2>&1} | ? {$_ -is [System.Management.Automation.ErrorRecord]} | %{$_.Exception.ToString().Split()[1]} | % {del $_}
        【解决方案6】:

        您不能在 perforce 中修改/删除不属于您的工作空间的文件。您必须为此编写外部脚本。

        【讨论】:

        • 我认为他以两种不同的方式使用了“工作区”一词。他试图删除的文件在他的工作区中,但没有签入(正如 perforce 将其他文件与相关文件放在一起的事实所证明的那样)。
        【解决方案7】:

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

        【讨论】:

        • 奇怪,我的 p4 exe 没有 nothave。这可能只在 linux 版本中吗?
        • p4 nothave 不存在。你必须用 find、“p4 have”和 comm(1) 来伪造它。
        • 如何才能接受这个答案,我将投反对票,希望 op 能恢复正确。
        • 事实证明,这是我雇主使用的特定实现中的非标准扩展。正在删除答案。
        • 显然,我无法删除它,因为这已被接受为答案。 @Matt,你能取消标记/选择一个不同的答案,以便我删除它吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-16
        • 1970-01-01
        • 2016-03-17
        • 2011-07-05
        • 2023-02-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多