如何从Perforce工作树中删除未跟踪的文件?
Perforce的等效功能是什么 git clean-从工作树中删除未跟踪的文件 从当前目录开始,通过递归删除不受版本控制的文件来清理工作树 -x不使用从.gitignore(per)读取的标准忽略规则 目录)和$GIT_DIR/info/exclude,但仍使用忽略 使用-e选项给出的规则。这允许删除所有未跟踪的文件, 包括构建产品。这可以使用(可能结合使用) 使用git reset)创建一个原始的工作目录来测试一个干净的 建造 -X仅删除Git忽略的文件。这可能有助于重建 一切从头开始,但保留手动创建的文件如何从Perforce工作树中删除未跟踪的文件?,perforce,Perforce,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\…”将从变更列表和磁盘中删除所有其他文件
p4 clean
将还原您对任何挂起的更改列表之外的文件所做的更改。因此,谨慎的做法是使用“干运行”选项测试结果p4 clean-n
据我了解:
模拟p4 clean-a
“从工作树中删除未跟踪的文件。”git clean
模拟p4 clean-a-I
“删除所有未跟踪的文件,包括生成产品。”git clean-x
。与忽略列表匹配的未跟踪文件将被删除,其他文件将移动到默认更改列表p4协调-a和&p4清理-a-I
p4 fstat
检查文件是否受Perforce的版本控制。如果不是,Perforce将以无此类文件的响应,此时脚本将删除该文件。使用这个技巧,脚本会更快,因为不需要对仓库进行完全的重新同步。@fbrereton:你说得对。我的第一个建议很简单,但不是最好的。按照你的建议,我在回答中添加了另一个想法,但是使用files命令而不是fstat命令;是否有任何方法来尊重.p4ignore?请小心,看起来此解决方案不适用于带有spacesNote的文件名,此脚本将不喜欢路径名中带有-或#字符的文件。这是一个错误。使用上面的一个,没有类似的。在numpties网站上为功能请求投票。链接中有一些微妙之处需要注意,请参见下面我的答案,大多数p4命令都是如此:-),感谢您的澄清。