有人拥有脚本或别名来在Perforce树中查找未跟踪(实际上是未添加)的文件吗?
编辑:我更新了对此的可接受的答案,因为看起来P4V在2009年1月的发行版中对此添加了支持。
有人拥有脚本或别名来在Perforce树中查找未跟踪(实际上是未添加)的文件吗?
编辑:我更新了对此的可接受的答案,因为看起来P4V在2009年1月的发行版中对此添加了支持。
p4 status
不仅是查找未跟踪的文件,它实际上还可以开始跟踪它们。即,p4 status
这不是一个只读查询,就像从名称中可能会怀疑的那样,但实际上是一个更改内容的命令-而不是工作区文件。这不是状态命令应该做什么,也不是做什么svn status
。我能找到的最接近的内容svn status
是p4 reconcile -na
--a表示“应添加的文件”,-n表示“实际上没有更改任何内容”。///我最初说的要强得多。
p4 status
),然后自己回答。更好的欢迎
p4 reconcile
和p4 status
是缓慢的地狱,而git status
最终在1-3秒执行。
Answers:
编辑:请立即使用p4 status
。不再需要跳铁圈了。参见@ColonelPanic的答案。
在2009年1月版的P4V中,您可以右键单击工作区树中的任何文件夹,然后单击“协调离线工作...”。
这将进行一些处理,然后显示未检出但与软件仓库版本有所不同或根本未检入的文件的拆分树视图。它甚至可能提出其他一些类别。
您可以在此视图中右键单击文件,然后将它们检出,添加或什至还原它们。
这是一个非常方便的工具,已经节省了我几次。
编辑:啊,这个问题专门询问了脚本,但是为了以防万一,我将在这里留下这个答案。
p4 status
不仅可以查找未跟踪的文件,它还可以开始跟踪它们。即,p4 status
这不是一个只读查询,就像从名称中可能会怀疑的那样,但实际上是一个更改内容的命令-而不是工作区文件。这不是状态命令应该做什么,也不是做什么svn status
。我能找到的最接近的东西svn status
是p4 reconcile -na
--a表示“应添加的文件”,-n表示“实际上不更改任何内容”。///我最初说的要强得多。
p4 status
基本上是的同义词p4 reconcile -n
。也许您跑了p4 status -A
,这是的同义词p4 reconcile
?
在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
.p4ignore
并可以预览和自动编辑未跟踪/更改/删除的文件。
find . -type l
),并且会为强制添加的P4文件提供误导性输出,因为它们包含@
或%
字符。但是,此类文件很少,因此在大多数情况下可以手动检查这些极端情况。
是否有
svn status
或的类似物git status
?
是的,但是。
从Perforce 2012.1版开始,该命令已存在,p4 status
并且在P4V中“协调脱机工作”。但是,它们都很慢。要排除不相关的文件,您需要p4ignore.txt
按照https://stackoverflow.com/a/13126496/284795编写文件
p4 status
自2012.1版本以来,已对性能进行了一些改进。如果您p4 status
出于性能方面的考虑而远离,那么可能值得再次对其进行测试,以了解它现在的表现。
我觉得不得不添加一个答案,因为被接受的答案以及其他一些答案都存在我认为的重大问题:他们不理解只读查询命令与进行更改的命令之间的区别。
我不希望这个答案有什么用,但是我希望它可以帮助其他人避免浪费时间并遵循公认的但恕我直言的错误答案。
---简介
在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
GUI
在GUI中p4v
,reconcile命令查找可能需要添加,删除或打开以进行编辑的本地更改。幸运的是,默认情况下它不会将它们添加到变更列表中。但是如果您不想提交更改,您仍然可能要在检查协调窗口后小心关闭它。
我在工具中使用以下内容来备份工作区中与存储库不同的所有文件(对于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 ” 以“裸”格式(/ B)列出此文件夹(/ S)或以下的所有文件(/ S),但目录(/ AD)除外。“ sed ”将危险字符更改为其“ %xx ”形式(例如HTML),并且“ p4 have ”命令对照服务器丢弃此列表(“ -x- ”)以丢弃其实际上位于存储库中的文件的任何内容(“ 1> NUL: ”)。结果是一串类似:
Z:\No_Backup\Workspaces\full\depot\Projects\Archerfish\Portal\Main\admin\html\images\nav\navxx_background.gif - file(s) not on client.
等等!
该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