如何在Perforce树中查找未跟踪的文件? (svn状态的模拟)

时间:2008-08-12 21:44:32

标签: version-control perforce

任何人都有脚本或别名来查找Perforce树中未跟踪(真的:未添加)的文件?

编辑:我更新了这个问题的答案,因为看起来P4V在2009年1月的版本中增加了对此的支持。

16 个答案:

答案 0 :(得分:78)

编辑:请立即使用p4 status。没有必要再跳过篮球了。请参阅@ ColonelPanic的answer

在2009年1月版的P4V中,您可以右键单击工作区树中的任何文件夹,然后单击“协调脱机工作......”

这将进行一些处理,然后显示未检出但与库版本不同或根本没有签入的文件的拆分树视图。它甚至可能会出现一些其他类别。

您可以右键单击此视图中的文件并将其签出,添加,甚至还原它们。

这是一个非常方便的工具,几次救了我的屁股。

编辑:啊问题是关于脚本的具体问题,但我会在这里留下这个答案以防万一。

答案 1 :(得分:49)

在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

答案 2 :(得分:18)

在Unix下:

find -type f ! -name '*~' -print0| xargs -0 p4 fstat 2>&1|awk '/no such file/{print $1}'

这将打印出未在客户端或Perforce软件仓库中添加的文件列表。我使用! -name '*~'来排除以〜。

结尾的文件

答案 3 :(得分:12)

啊,Perforce经典之一:)是的,真的很糟糕的是,STILL并没有简单的方法将其内置到默认命令中。

最简单的方法是运行命令以查找客户端根目录下的所有文件,然后尝试将它们添加到库中。您最终将获得所有新文件的更改列表,并忽略现有文件。

e.g dir / s / b / A-D | p4 -x - 添加

(使用来自nix命令行的'find.-type f -print')。

如果你想要一个物理列表(在控制台或文件中),那么你可以管理差异的结果(如果你也想在变更列表中添加它们,也可以添加)。

如果您在P4Win中运行此功能,则可以使用$ r替换当前工作区的客户端根目录。

答案 4 :(得分:11)

  

是否有svn statusgit status

的类似物

是的,但是

从Perforce版本2012.1开始,命令p4 status和P4V'协调脱机工作'。但是,它们都很慢。要排除不相关的文件,您需要按https://stackoverflow.com/a/13126496/284795

编写p4ignore.txt个文件

答案 5 :(得分:6)

我觉得有必要添加一个答案,因为接受的答案和其他一些答案都有我认为是一个重大问题:他们不理解只读查询命令和一个命令之间的区别变化。

我不希望得到这个答案的任何功劳,但我希望通过遵循已接受但恕我直言的错误答案,帮助他人避免浪费时间和犯错误。

--- +简介

在perforce工作区中查找所有未跟踪文件的最便捷方式可能是p4 reconcile -na

-a说"给我不在存储库中的文件,即应添加的文件"。

-n说"不做任何更改" - 即干跑。 (虽然这些消息可能会说"为了添加&#34而打开;但在精神上你必须将其解释为"如果不是-n&#34则会打开以进行添加;)

可能是查找离线时所做的所有本地更改的最便捷方式 - 不仅包括可能需要添加的文件,还包括可能需要删除的文件,或者未通过{{ 1}},是p4 edit

有几个答案提供了脚本,通常涉及p4 reconcile -n。虽然我还没有验证所有这些脚本,但我经常使用类似的脚本来弥补perforce命令的不足,例如p4 fstat - 例如我经常发现我想要本地路径,而不是Perforce depot路径或工作空间路径。

--- +警告

p4 reconcile -n不是其他版本控制系统上状态命令的对应部分。

p4 status不是只读查询。 p4 status实际上找到了p4 status所做的相同类型的更改,并将它们添加到存储库中。 p4 reconcile似乎没有像p4 status这样的-n干运行选项。

如果您执行p4 reconcile,请查看文件并思考"哦,我不需要那些",如果您需要,则必须p4 status继续在同一工作区中编辑。否则,p4 revert添加到您的变更集的更改将在下次检查。

似乎很少或没有理由使用p4 status而不是p4 status,除了本地工作区与软件仓库路径名的一些细节。

我只能想象那个选择“地位”的人。对于非只读命令,对英语和其他版本控制工具的命令有限。

--- + p4 reconcile -n GUI

在GUI P4V中,reconcile命令查找可能需要添加,删除或打开以进行编辑的本地更改。幸运的是,默认情况下它不会将它们添加到更改列表中;但是如果您不想提交更改,您仍可能需要在检查后关闭协调窗口。

答案 6 :(得分:4)

或者从P4Win,使用左侧视图面板中的“”不在库中的本地文件“选项。

我没有太多使用P4V,但我认为相当于在工作区视图选项卡的过滤器下拉列表中选择“隐藏本地工作区文件”.p4 help fstat

在P4V 2015.1中,你会在过滤按钮下找到这些选项,如下所示: enter image description here

答案 7 :(得分:4)

我在我的工具中使用以下内容来备份工作区中与存储库不同的任何文件(对于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:

dir / S / B / AD ”以“裸”格式列出此文件夹( / S )或其下的所有文件( / B < / strong>)不包括目录(/ AD )。 “ sed ”会将危险字符更改为“%xx ”表单(一个HTML),“ p4 has ”命令会检查此字符列表(“ -x - ”)针对服务器丢弃其实际位于存储库中的文件的任何内容(“ 1&gt; NUL:”)。结果如下:

Z:\No_Backup\Workspaces\full\depot\Projects\Archerfish\Portal\Main\admin\html\images\nav\navxx_background.gif - file(s) not on client.

Etvoilà!

答案 8 :(得分:2)

快速肮脏:在p4v中右键单击相关文件夹,并将其下的所有文件添加到新的更改列表中。变更列表现在将包含当前不属于软件仓库的所有文件。

答案 9 :(得分:1)

以下命令产生类似状态的输出,但没有一个与svn statusgit status完全等效,提供了每个文件状态的单行摘要:

  • p4 status
  • p4 opened
  • p4 diff -ds

答案 10 :(得分:0)

我没有足够的声誉点来评论,但Ross的解决方案还列出了可以添加的文件。您可能想要使用他的答案来清理您的工作区。

以下使用p4 fstat(感谢Mark Harrison)代替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"

===雅克

答案 11 :(得分:0)

我需要能在Linux,Mac或Windows中运行的东西。所以我为它写了一个Python脚本。基本思想是遍历文件并在每个文件上执行p4 fstat。 (当然忽略依赖关系和tmp文件夹)

您可以在此处找到它:https://gist.github.com/givanse/8c69f55f8243733702cf7bcb0e9290a9

答案 12 :(得分:0)

此命令可以为您提供需要添加,编辑或删除的文件的列表:
p4状态-aed ...
您也可以单独使用它们
p4状态-a ...
p4状态-e ...
p4状态-d ...

答案 13 :(得分:0)

快速的方法,但很少正统。如果代码库没有经常添加新文件/更改视图,您可以创建一个本地的git&#39;您的结帐时存储库。从干净的perforce同步,git init,在本地添加和提交所有文件。 Git状态很快,将显示之前未提交的文件。

答案 14 :(得分:0)

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 ...

如果它已被删除&#39;然后它已从工作区中删除。请注意,上述命令正在预览模式(-n)中运行。

答案 15 :(得分:-1)

在P4V中,在“查看”菜单项下选择“文件夹中的文件”,这会在右侧窗格中显示一个新选项卡。 在选项卡的最右侧有一个小图标,显示一个名为“文件夹中的文件”的窗口,带有2个图标。 选择看起来像漏斗的左侧图标,您将看到几个选项。选择“显示不在软件仓库中的项目”,将显示该文件夹中的所有文件。 然后右键单击要添加的文件,选择“标记为添加...”。您可以在“待处理”标签中验证它是否存在。 只需正常提交(Ctrl + S)。