如何从Perforce工作树中删除未跟踪的文件?

如何从Perforce工作树中删除未跟踪的文件?,perforce,Perforce,Perforce的等效功能是什么 git clean-从工作树中删除未跟踪的文件 从当前目录开始,通过递归删除不受版本控制的文件来清理工作树 -x不使用从.gitignore(per)读取的标准忽略规则 目录)和$GIT_DIR/info/exclude,但仍使用忽略 使用-e选项给出的规则。这允许删除所有未跟踪的文件, 包括构建产品。这可以使用(可能结合使用) 使用git reset)创建一个原始的工作目录来测试一个干净的 建造 -X仅删除Git忽略的文件。这可能有助于重建 一切从头开始,但保

Perforce的等效功能是什么

git clean-从工作树中删除未跟踪的文件

从当前目录开始,通过递归删除不受版本控制的文件来清理工作树

-x不使用从.gitignore(per)读取的标准忽略规则 目录)和$GIT_DIR/info/exclude,但仍使用忽略 使用-e选项给出的规则。这允许删除所有未跟踪的文件, 包括构建产品。这可以使用(可能结合使用) 使用git reset)创建一个原始的工作目录来测试一个干净的 建造

-X仅删除Git忽略的文件。这可能有助于重建 一切从头开始,但保留手动创建的文件


没有对等的标准。Perforce没有删除不受其控制的文件的命令。您可以在P4V中的“工作区”选项卡上看到它们(它们有纯白色图标,而不是带绿点的线条图标),然后手动删除它们。如果您希望自动化该过程,最简单的方法是从工作区中删除文件,删除目录中的所有内容,然后将其同步备份。执行此操作的批处理文件如下所示:

p4 sync "//depot/someFolder/...#0"
erase C:\projects\someFolder\*.* /s /q /f
rd C:\projects\someFolder /s  /q
p4 sync -f "//depot/someFolder/..."
如果使用erase和sync命令上的强制开关,则第一行是可选的


然而,这种解决方案也有其缺点。如果您当前正在处理任何一个文件,您显然不想删除它们。此外,如果您希望清理目录树中的大量数据,则完全同步可能需要相当长的时间

一个更好的方法是让您的clean实用程序(我认为我们现在已经超越了批处理文件)使用
p4 files
命令获取版本控制下的文件列表。然后遍历目录中的所有文件,删除列表中未显示的文件。

从顶级目录中尝试(对于Unix):

# Find all files and filter for those that are unknown by Perforce
find . -type f | p4 -x - fstat 2>&1 > /dev/null | sed 's/ -.*$//' > /tmp/list
### manually check /tmp/list for files you didn't mean to delete
# Go ahead and remove the unwanted files.
xargs rm < /tmp/list
#查找所有文件,并筛选Perforce未知的文件
找到-键入f | p4-x-fstat 2>&1>/dev/null | sed's/-.*$/'>/tmp/list
###手动检查/tmp/list以查找您不打算删除的文件
#继续并删除不需要的文件。
xargs rm

或者,对于clean-f类方法,只需直接通过管道连接到xargs rm,而不是首先将文件列表暂存到/tmp/list中。

Easy Gui解决方案以及这里已经提到的示例:
令人沮丧的是,你不能,。没有类似的
svnclean
gitclean
。遗憾的是,这些命令非常有用


在Perforce的网站上有一个呼吁,要求开发者添加一个干净的命令

在linux上,无需临时文件即可完成:

find . -type f | p4 -x- have 2>&1 >/dev/null  | grep "not on client" | cut -d " " -f1 | xargs -ifoo echo rm foo

使用P4V,您可以右键单击文件夹并选择“协调脱机工作…”。在中间面板(“本地文件不在仓库”)中,所有的文件可以在文件夹树中找到,而不是在仓库中列出。您可以选择其中的部分或全部,然后右键单击并选择“删除本地文件”

这不是一个脚本,但它比Windows上的大多数其他解决方案简单得多。

在Windows中:

@ECHO OFF
SETLOCAL EnableDelayedExpansion
IF "%1"=="" ( 
    SET proceed=N
    ECHO Are you sure you wish to nuke all files under: 
    ECHO %CD%
    SET /P proceed="Y/N: "
    ECHO !proceed!
    IF /I "!proceed!"=="Y" (
        ECHO Nuking %cd%
        FOR /F "tokens=1 delims=-#" %%G IN ('p4 reconcile -nlad -f ...') do (
            DEL /F "%%G"
        )
    )
) ELSE IF /I "%1"=="-n" (
    ECHO Files to be deleted 1>&2
        FOR /F "tokens=1 delims=-#" %%G IN ('p4 reconcile -nlad -f ...') do (
            ECHO "%%G"
        )
) ELSE GOTO :USAGE

GOTO :STOP

:USAGE
ECHO Usage: nuke [-n]
ECHO     -n will only write the files to be deleted but will not actually delete them

:STOP

这一个效果更好:

@ECHO OFF
SETLOCAL EnableDelayedExpansion
IF "%1"=="" ( 
    SET proceed=N
    ECHO Are you sure you wish to nuke all files under: 
    ECHO %CD%
    SET /P proceed="Y/N: "
    ECHO Looking for files to be deleted.  This may take some time depending on the depth of your tree. 1>&2
    IF /I "!proceed!"=="Y" (
        ECHO Nuking %cd%
        FOR /F "tokens=1 delims=#" %%G IN ('p4 reconcile -nla -f ...') DO (
            DEL /F %%G
        )
    )
) ELSE IF /I "%1"=="-n" (
    ECHO Looking for files to be deleted.  This may take some time depending on the depth of your tree. 1>&2
    ECHO Files to be deleted 1>&2
    FOR /F "tokens=1 delims=#" %%G IN ('p4 reconcile -nla -f ...') DO (
        ECHO %%G
    )
) ELSE GOTO :USAGE

GOTO :STOP

:USAGE
ECHO Usage: nuke [-n]
ECHO     -n will only write the files to be deleted but will not actually delete them

:STOP

如果我的变更列表没有更改,我将使用next命令

  • 运行“p4协调”命令,协调在Perforce之外所做的所有更改(如果只需要未跟踪的文件,则可以使用密钥)
  • 运行“p4 revert path\…,v”,从变更列表中删除服务文件(后缀为,v,它们是通过协调添加的),但将其保留在文件系统中
  • 运行“p4 revert-w path\…”将从变更列表和磁盘中删除所有其他文件

新的应该可以做到这一点

在“恢复工作区文件以匹配相应仓库文件的状态”之间的行为存在细微差异 和“从工作树中删除未跟踪的文件”,因此请仔细阅读手册

特别是,vanilla
p4 clean
将还原您对任何挂起的更改列表之外的文件所做的更改。因此,谨慎的做法是使用“干运行”选项测试结果
p4 clean-n

据我了解:

  • p4 clean-a
    模拟
    git clean
    “从工作树中删除未跟踪的文件。”
  • p4 clean-a-I
    模拟
    git clean-x
    “删除所有未跟踪的文件,包括生成产品。”
令我沮丧的是,没有完全类似于git clean-X的“仅删除被git忽略的文件”,但您可以使用以下方法来近似:

  • p4协调-a和&p4清理-a-I
    。与忽略列表匹配的未跟踪文件将被删除,其他文件将移动到默认更改列表

此功能的扩展是使用
p4 fstat
检查文件是否受Perforce的版本控制。如果不是,Perforce将以
无此类文件的响应
,此时脚本将删除该文件。使用这个技巧,脚本会更快,因为不需要对仓库进行完全的重新同步。@fbrereton:你说得对。我的第一个建议很简单,但不是最好的。按照你的建议,我在回答中添加了另一个想法,但是使用files命令而不是fstat命令;是否有任何方法来尊重.p4ignore?请小心,看起来此解决方案不适用于带有spacesNote的文件名,此脚本将不喜欢路径名中带有-或#字符的文件。这是一个错误。使用上面的一个,没有类似的。在numpties网站上为功能请求投票。链接中有一些微妙之处需要注意,请参见下面我的答案,大多数p4命令都是如此:-),感谢您的澄清。