任何人都有脚本或别名来在 Perforce 树中查找未跟踪的(真的:未添加的)文件?
编辑:我更新了已接受的答案,因为看起来 P4V 在 2009 年 1 月的版本中增加了对此的支持。
任何人都有脚本或别名来在 Perforce 树中查找未跟踪的(真的:未添加的)文件?
编辑:我更新了已接受的答案,因为看起来 P4V 在 2009 年 1 月的版本中增加了对此的支持。
编辑:请p4 status
立即使用。不再需要跳过篮球。请参阅@ColonelPanic 的回答。
在 2009 年 1 月版的 P4V 中,您可以右键单击工作区树中的任何文件夹,然后单击“协调脱机工作...”
这将进行一些处理,然后显示未签出但与软件仓库版本不同或根本未签入的文件的拆分树视图。它甚至可能带来一些其他类别。
您可以右键单击此视图中的文件并检出、添加甚至还原它们。
这是一个非常方便的工具,它救了我好几次。
编辑:啊这个问题专门询问了脚本,但我会在这里留下这个答案以防万一。
在 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 - 添加
(在 nix 命令行中使用 'find . -type f -print')。
如果您想要一个物理列表(在控制台或文件中),那么您可以管道差异的结果(或者如果您还希望它们在更改列表中,则添加)。
如果您在 P4Win 中运行它,您可以使用 $r 替换当前工作区的客户端根目录。
有
svn status
or的类似物git status
吗?
是的,但是。
从 Perforce 版本 2012.1 开始,p4 status
在 P4V 中有命令和“协调离线工作”。但是,它们都非常缓慢。要排除不相关的文件,您需要根据https://stackoverflow.com/a/13126496/284795p4ignore.txt
编写一个文件
2021-07-16:此答案可能已过时。
我有理由确定它在 2016 年是准确的,无论我使用的是什么版本的 Perforce(不一定是最新的)。但似乎这个问题或设计限制已在 Perforce 的后续版本中得到纠正。我不知道堆栈溢出礼仪是什么——应该删除这个答案吗?
2016年答案
我觉得有必要添加一个答案,因为接受的答案和其他一些答案存在我认为的一个重大问题:他们不理解只读查询命令和进行更改的命令之间的区别。
我不希望这个答案有任何功劳,但我希望它可以帮助其他人通过遵循已接受但恕我直言不正确的答案来避免浪费时间和犯错误。
---+ 简介
在 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
图形界面
在 GUIp4v
中,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 ) 或以下的所有文件,不包括目录 (/ 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.
瞧!
Quick 'n Dirty:在 p4v 中右键单击有问题的文件夹并将其下的所有文件添加到新的更改列表中。更改列表现在将包含当前不属于软件仓库的所有文件。
以下命令产生类似状态的输出,但没有一个完全等同于svn status
or git status
,提供每个文件状态的单行摘要:
p4 status
p4 opened
p4 diff -ds
我没有足够的声誉点来评论,但罗斯的解决方案还列出了可以添加的文件。你可能不想用他的回答来清理你的工作空间。
以下使用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"
===江湖
方法快,但不太正统。如果代码库不经常添加新文件/更改视图,您可以在结帐时创建一个本地“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
此命令可以为您提供需要添加、编辑或删除的文件列表:
p4 status -aed ...
您也可以单独使用它们
p4 status -a ...
p4 status -e ...
p4 status -d ...
在 P4V 中,在“查看”菜单项下选择“文件夹中的文件”,这会在右侧窗格中打开一个新选项卡。在选项卡的最右侧有一个小图标,它会打开一个名为“文件夹中的文件”的窗口,其中包含 2 个图标。选择看起来像漏斗的左侧图标,您将看到几个选项。选择“显示不在仓库中的项目”,文件夹中的所有文件都会显示出来。然后只需右键单击要添加的文件并选择“标记为添加...”。您可以在“待处理”选项卡中验证它是否存在。只需正常提交 (Ctrl+S)。