如何在 Perforce 树中查找未跟踪的文件?(svn状态的模拟)
-
08-06-2019 - |
题
任何人都有一个脚本或别名来查找未跟踪的(实际上:Perforce 树中的未添加)文件?
编辑:我更新了对此已接受的答案,因为看起来 P4V 在 2009 年 1 月的版本中添加了对此的支持。
解决方案
编辑: 请用 p4 status
现在。不再需要跳圈了。参见@ColonelPanic 的 回答.
在 P4V 2009 年 1 月版本中,您可以右键单击工作区树中的任何文件夹,然后单击“协调脱机工作...”
这将进行一些处理,然后显示未签出但与软件仓库版本有差异或根本未签入的文件的拆分树视图。它甚至可能会带来一些其他类别。
您可以右键单击此视图中的文件并查看、添加甚至还原它们。
这是一个非常方便的工具,好几次救了我的命。
编辑:啊,这个问题具体询问了脚本,但为了以防万一,我将把这个答案留在这里。
其他提示
在 Linux 上,或者如果您在 Windows 上安装了 gnu-tools:
find . -type f -print0 | xargs -0 p4 fstat >/dev/null
这将为每个未计入的文件显示一条错误消息。如果你想捕获该输出:
find . -type f -print0 | xargs -0 p4 fstat >/dev/null 2>mylogfile
在Unix下:
find -type f ! -name '*~' -print0| xargs -0 p4 fstat 2>&1|awk '/no such file/{print $1}'
这将打印出未添加到您的客户端或 Perforce 仓库中的文件列表。我用过 ! -name '*~'
排除以 ~ 结尾的文件。
啊,Perforce 经典之一:) 是的,确实很糟糕,因为仍然没有简单的方法可以将其内置到默认命令中。
最简单的方法是运行命令来查找客户端根目录下的所有文件,然后尝试将它们添加到软件仓库中。您最终将得到所有新文件的更改列表,并且现有文件将被忽略。
例如dir /s /b /ad | P4 -X-添加
(使用“查找.-type f -print' 从 nix 命令行)。
如果您想要一个物理列表(在控制台或文件中),那么您可以通过管道传递差异的结果(或者如果您也希望它们位于更改列表中则添加)。
如果您在 P4Win 中运行它,您可以使用 $r 替换当前工作区的客户端根目录。
有没有类似的
svn status
或者git status
?
对,但是.
从 Perforce 版本 2012.1 开始,有以下命令 p4 status
并在 P4V 中“协调离线工作”。然而,它们都非常慢。要排除不相关的文件,您需要编写 p4ignore.txt
文件每 https://stackoverflow.com/a/13126496/284795
我觉得有必要添加一个答案,因为已接受的答案以及其他一些答案存在我认为的重大问题:他们不理解只读查询命令和进行更改的命令之间的区别。
我不希望这个答案有任何功劳,但我希望它能帮助其他人避免浪费时间和犯错误,遵循已接受但恕我直言不正确的答案。
---+ 简介
在 perforce 工作区中查找所有未跟踪文件的最便捷方法可能是 p4 reconcile -na
.
-a
说“给我不在存储库中的文件,即应该添加这一点”。
-n
说“不做任何改变” - 即试运行。(虽然消息可能会说“打开添加”,但在心理上您必须将其解释为“如果不是 -n,则将打开添加”)
可能是查找脱机时所做的所有本地更改的最便捷方法 - 不仅是可能需要添加的文件,还包括可能需要删除的文件,或者已更改但未打开进行编辑的文件 p4 edit
, , 是 p4 reconcile -n
.
几个答案提供了脚本,通常涉及 p4 fstat
. 。虽然我还没有验证所有这些脚本,但我经常使用类似的脚本来弥补 perforce 命令的缺陷,例如 p4 reconcile -n
- 例如我经常发现我需要本地路径而不是 Perforce 仓库路径或工作区路径。
---+ 警告
p4 status
与其他版本控制系统上的状态命令不同。
p4 status
不是只读查询。 p4 status
实际上发现了同样的变化 p4 reconcile
执行,并将它们添加到存储库中。 p4 status
似乎没有 -n
试运行选项如 p4 reconcile
做。
如果你这样做 p4 status
, ,查看文件并想“哦,我不需要那些”,那么你将不得不 p4 revert
如果您想继续在同一工作区中进行编辑,请使用它们。或者说改变 p4 status
添加到您的变更集中的内容将在下次检查。
似乎很少或没有理由使用 p4 status
而不是 p4 reconcile -n
, ,除了本地工作空间与仓库路径名的一些详细信息。
我只能想象,为非只读命令选择“状态”的人对英语和其他版本控制工具的掌握有限。
---+ P4V
图形用户界面
在图形用户界面中 p4v
, ,协调命令查找可能需要添加、删除或打开进行编辑的本地更改。幸运的是,默认情况下它不会将它们添加到更改列表中;但如果您不想提交更改,则在检查后仍可能需要小心关闭协调窗口。
我在我的工具中使用以下内容来备份工作区中与存储库(对于 Windows)不同的所有文件。它处理 Perforce 不太喜欢的一些奇怪情况,例如嵌入的空白、星号、百分比和井号:
dir /S /B /A-D | sed -e "s/%/%25/g" -e "s/@/%40/g" -e "s/#/%23/g" -e "s/\*/%2A/g" | p4 -x- have 1>NUL:
"目录 /S /B /A-D" 列出该文件夹中或该文件夹下的所有文件 (/S)以“裸”格式(/B) 不包括目录 (/广告)。这 ”sed“将危险人物改为他们的”%xx“ 表单(a la HTML),以及 “p4有“命令检查此列表(”-X-") 反对服务器丢弃它在存储库中实际定位的文件的任何内容 ("1>无:”)。结果是一堆像这样的行:
Z:\No_Backup\Workspaces\full\depot\Projects\Archerfish\Portal\Main\admin\html\images\nav\navxx_background.gif - file(s) not on client.
瞧!
又快又脏:在 p4v 中,右键单击相关文件夹,并将其下的所有文件添加到新的更改列表中。更改列表现在将包含当前不属于软件仓库的所有文件。
以下命令产生类似状态的输出,但没有一个完全等同于 svn status
或者 git status
, ,提供每个文件状态的一行摘要:
p4 status
p4 opened
p4 diff -ds
我没有足够的声誉点来发表评论,但罗斯的解决方案还列出了可供添加的文件。你可能会这样做 不是 想用他的答案来清理你的工作空间。
以下用途 p4 fstat
(感谢马克·哈里森)而不是 p4 have
, ,并列出不在库中的文件 和 不开放添加。
dir /S /B /A-D | sed -e "s/%/%25/g" -e "s/@/%40/g" -e "s/#/%23/g" -e "s/\*/%2A/g" | p4 -x- fstat 2>&1 | sed -n -e "s/ - no such file[(]s[)]\.$//gp"
===江淮汽车
快速的方法,但不太正统。如果代码库不经常添加新文件/更改视图,您可以在结账时创建一个本地“git”存储库。从干净的 perforce 同步、git init、本地添加并提交所有文件。Git 状态很快,并且会显示以前未提交的文件。
这 p4 fstat
命令可让您测试工作区中是否存在文件,结合使用 find
找到要检查的文件,如以下 Perl 示例所示:
// throw the output of p4 fstat to a 'output file'
// find:
// -type f :- only look at files,
// -print0 :- terminate strings with \0s to support filenames with spaces
// xargs:
// Groups its input into command lines,
// -0 :- read input strings terminated with \0s
// p4:
// fstat :- fetch workspace stat on files
my $status=system "(find . -type f -print0 | xargs -0 p4 fstat > /dev/null) >& $outputFile";
// read output file
open F1, $outputFile or die "$!\n";
// iterate over all the lines in F1
while (<F1>) {
// remove trailing whitespace
chomp $_;
// grep lines which has 'no such file' or 'not in client'
if($_ =~ m/no such file/ || $_ =~ m/not in client/){
// Remove the content after '-'
$_=~ s/-\s.*//g;
// below line is optional. Check ur output file for more clarity.
$_=~ s/^.\///g;
print "$_\n";
}
}
close F1;
或者你可以使用 p4 reconcile -n -m ...
如果它是“打开以删除”,则它已从工作区中删除。请注意,上述命令是在预览模式下运行的(-n
).
我需要一些可以在 Linux、Mac 或 Windows 中运行的东西。所以我为它写了一个Python脚本。基本思想是遍历文件并执行 p4 fstat
在各个。(当然忽略依赖项和 tmp 文件夹)
你可以在这里找到它: https://gist.github.com/givanse/8c69f55f8243733702cf7bcb0e9290a9
在 P4V 中,在“查看”菜单项下选择“文件夹中的文件”,这会在右侧窗格中显示一个新选项卡。选项卡的最右侧有一个小图标,可打开一个名为“文件夹中的文件”的窗口,其中有 2 个图标。选择左侧看起来像漏斗的图标,您将看到几个选项。选择“显示不在 Depot 中的项目”,文件夹中的所有文件都会显示。然后只需右键单击要添加的文件并选择“标记为添加...”。您可以在“待处理”选项卡中验证它是否存在。只需照常提交 (Ctrl+S)。