如何在Perforce树中查找未跟踪的文件? (svn状态的模拟)
任何人都有一个脚本或别名在Perforce树中查找未跟踪(真正:未join)的文件?
编辑:我更新了这个接受的答案,因为它看起来像P4V在2009年1月发布增加了对此的支持。
编辑:请现在使用p4 status
。 没有必要再跳过箍。 查看@ ColonelPanic的答案 。
在2009年1月版的P4V中,您可以右键单击工作区树中的任意文件夹,然后单击“协调离线工作…”
这将进行一些处理,然后调出未检出但与depot版本不同的文件的拆分树视图,或者根本没有检入。 甚至可能还有其他一些类别。
您可以右键单击此视图中的文件,然后检出它们,添加它们,甚至还原它们。
这是一个非常方便的工具,几次救了我的屁股。
编辑:啊关于脚本的具体问题,但我会留下这个答案,以防万一。
在linux上,或者如果你在Windows上安装了gnu-tools:
find . -type f -print0 | xargs -0 p4 fstat >/dev/null
这将显示每个未logging文件的错误消息。 如果你想捕捉那个输出:
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 '*~'
! -name '*~'
排除以〜结尾的文件。
呵呵,Perforce的经典之作:)是的,它真的很糟糕,它还没有简单的方法将它embedded到默认命令中。
最简单的方法是运行一个命令来查找您的客户机根目录下的所有文件,然后尝试将它们添加到软件仓库。 您将最终得到所有新文件的更改列表,现有文件将被忽略。
例如dir / s / b / AD | p4 -x – add
(使用nix命令行中的“find。-type f -print”)。
如果你想要一个物理列表(在控制台或文件中),那么你可以通过差异的结果(或者如果你想让它们在一个变更列表中)添加。
如果你在P4Win中运行这个,你可以用$ rreplace当前工作区的客户端。
有没有类似
svn status
或git status
?
是的,但是 。
从Perforce版本2012.1开始,就有命令p4 status
并在P4V中“协调离线工作”。 但是,他们都很慢。 要排除不相关的文件,你需要编写一个p4ignore.txt
文件,每个https://stackoverflow.com/a/13126496/284795
我在我的工具中使用以下内容备份工作空间中与存储库不同的任何文件(对于Windows)。 它处理了Perforce不太喜欢的一些奇怪的情况,比如embedded的空白,星星,百分比和哈希标记:
dir /S /B /AD | 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 ”以不包含目录(/ AD )的“裸”格式( / B )列出在此文件夹下的所有文件( / S )。 “ sed ”将危险的字符变成“ %xx ”forms(la HTML),“ p4 have ”命令检查服务器的这个列表(“ -x- ”),丢弃它实际上在存储库中find的文件(“ 1> NUL: ”)。 结果是一堆线如:
Z:\No_Backup\Workspaces\full\depot\Projects\Archerfish\Portal\Main\admin\html\images\nav\navxx_background.gif - file(s) not on client.
Etvoilà!
或者从P4Win中,使用左侧视图面板上的“”不在仓库中的本地文件“选项。
我不使用P4V,但我认为相当于在工作区视图tab.p4的filter下拉菜单中select“隐藏本地工作区文件”。帮助fstat
在P4V 2015.1中,您可以像下面这样在过滤button下find这些选项:
我觉得有必要增加一个答案,因为接受的答案和其他一些答案有我认为的一个重大问题:他们不了解只读查询命令和发生更改的命令之间的区别。
我不希望这个答案有任何功劳,但我希望这将帮助别人避免浪费时间和错误,遵循接受但恕我直言的不正确的答案。
— +简介
在perforce工作区中查找所有未跟踪文件的最方便的方法可能是p4 reconcile -na
。
-a
说:“给我不在版本库中的文件,即应该添加”。
-n
说“不做任何改变” – 即干运行。 (虽然消息可能会说“打开添加”,但在心理上,您必须将其解释为“如果不是-n,将会打开添加”)
可能是最方便的方法来查找所有在离线状态下进行的本地更改(不仅仅是可能需要添加的文件,还包括可能需要删除的文件或者没有通过p4 edit
打开进行编辑而p4 edit
)是p4 reconcile -n
。
几个答案提供了脚本,通常涉及p4 fstat
。 虽然我还没有validation所有这些脚本,但是我经常使用类似的脚本来弥补perforce命令的不足之处,例如p4 reconcile -n
– 例如,我经常发现我需要本地path而不是Perforce depotpath或工作空间path。
— +警告
p4 status
不是其他版本控制系统上的状态命令的对应物。
p4 status
不是只读查询。 p4 status
实际上会find与p4 reconcile
相同的更改,并将其添加到存储库。 p4 status
似乎没有像p4 reconcile
那样的-n
干运行选项。
如果你做p4 status
,看看这些文件,并想“哦,我不需要这些”,那么如果你想继续在同一个工作区编辑,你将不得不p4 revert
他们。 否则, p4 status
添加到变更集中的更改将在下次检查。
似乎很less或根本没有理由使用p4 status
而不是p4 reconcile -n
,除了本地工作区和软件仓库path名的一些细节。
我只能想象,谁select了“只读”命令的“状态”,限制了对英语和其他版本控制工具的控制。
— + P4V
GUI
在GUI p4v
,reconcile命令查找可能需要添加,删除或打开以进行编辑的本地更改。 幸运的是,默认情况下它不会将它们添加到更改列表中。 但是如果您不想提交更改,您在检查后仍然可能要小心地closures协调窗口。
快速肮脏:在p4v中,右键点击相关文件夹,将其下的所有文件添加到新的更改列表中。 现在,更改列表将包含当前不是库的一部分的所有文件。
以下命令产生类似状态的输出,但没有一个与svn status
或git status
相当,提供了每个文件状态的单行摘要:
-
p4 status
-
p4 opened
-
p4 diff -ds
我没有足够的声望点评论,但Ross的解决scheme也列出了可以添加的文件。 你可能不想用他的答案来清理你的工作区。
下面使用p4 fstat
(感谢Mark Harrison)而不是p4 have
,并列出不在仓库中的文件, 并且不打开添加。
dir /S /B /AD | 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"
===江淮
快速的方法,但很less正统。 如果代码库不会经常添加新文件/更改视图,则可以从结帐中创build本地“git”存储库。 从一个干净的perforce同步,git初始化,本地添加和提交所有文件。 Git状态很快,并会显示以前没有提交的文件。
//将p4 fstat的输出引发到“输出文件”
我的$ status = system“(find。-type f -print0 | xargs -0 p4 fstat> / dev / null)>&$ outputFile”;
//读取输出文件打开F1,$ outputFile或者死掉“$!\ n”;
while (<F1>){ chomp $_;
//有'没有这样的文件'或'不在客户端'的grep行
if($_ =~ m/no such file/ || $_ =~ m/not in client/){
//在' – '后删除内容
$_=~ s/-\s.*//g;
//下面的行是可选的。 检查你的输出文件更清晰。 $ _ =〜s /^./// g;
print "$_\n"; } } close F1;
或者你可以使用reconcile -n -m …
如果“打开删除”,则已从工作区中删除。 请注意,上述命令以预览模式('-n')运行。
在P4V中,在“查看”菜单项下select“在文件夹中的文件”,在右侧窗格中打开一个新的选项卡。 在标签的最右侧有一个小图标,带有一个名为“文件夹中的文件”的窗口,带有2个图标。 select看起来像一个渠道的左侧图标,你会看到几个选项。 select“显示不在仓库中的项目”,文件夹中的所有文件将显示出来。 然后,只需右键单击要添加的文件,然后select“标记为添加…”。 您可以在“待处理”选项卡中validation它是否存在。 只要提交正常(Ctrl + S)。