我想知道尝试删除已提交的更改列表有什么意义,因为已提交的更改列表不应该为空。
但是后来我正在使用教程库,并在整个分支上使用 obliterate 命令,我可以看到在某些情况下您可能会得到空的已提交更改列表(需要使用 -f 标志删除)。
但是,我不知道如何使用命令行找到它们,因为我不知道如何查找没有关联文件的更改列表。
有没有简单的方法可以做到这一点?
谢谢,
托马斯
我想知道尝试删除已提交的更改列表有什么意义,因为已提交的更改列表不应该为空。
但是后来我正在使用教程库,并在整个分支上使用 obliterate 命令,我可以看到在某些情况下您可能会得到空的已提交更改列表(需要使用 -f 标志删除)。
但是,我不知道如何使用命令行找到它们,因为我不知道如何查找没有关联文件的更改列表。
有没有简单的方法可以做到这一点?
谢谢,
托马斯
啊!
在问这个之前我应该浏览更多文档......
http://public.perforce.com/wiki/Perforce_Command_Line_Recipes
描述:删除所有空提交的变更列表。
shell命令:p4修改-s提交| 剪切 -d " " -f 2 | xargs -n1 p4 更改 -d -f
Powershell:p4 更改 -s 提交 | %{p4 更改 -d -f $_.split()[1]}
px: px -F %change% 更改 -s 提交 | px -X- change -d -f
贡献者:Sam Stafford、Philip Kania、Shawn Hladky
呃。
托马斯
要简单地查找所有提交的空更改列表而不删除它们,您可以比较以下两个命令的输出:
p4 changes -s submitted
- 所有更改列表p4 changes -s submitted //...
- 带有关联文件的所有更改列表例如,在 Windows PowerShell 中,运行
diff -ReferenceObject (p4 changes -s submitted) -DifferenceObject (p4 changes -s submitted //...)
当我在 Windows 上时,我创建了一个小脚本,在 PERL 中执行完全相同的操作,而不是 Shell、powershell 或 px :):
#*******************************************************************************
# Module: delete_empty_changelist.pl
# Purpose: A script to delete empty changelist
#
@list = `p4 changes -s submitted`;
foreach $chg (@list)
{
$chgnbr = (split /\s+/, $chg)[1];
print `p4 change -d -f $chgnbr`;
}
exit 0;
请注意,实际上,在所有情况下,它都不是一个非常聪明的脚本:它会尝试绝对删除每个提交的更改列表,并且会被强制阻止这样做,因为如果文件与之关联,您将收到错误消息。
我想应该将脚本的结果发送到日志并解析,以便仅突出显示相关行。
运行脚本将产生类似于以下内容的输出:
Change 857 has 1 files associated with it and can't be deleted.
Change 856 has 1 fixes associated with it and can't be deleted.
Change 855 has 1 fixes associated with it and can't be deleted.
Change 854 deleted.
Change 853 has 1 fixes associated with it and can't be deleted.
Change 852 has 8 files associated with it and can't be deleted.
Change 851 has 1 files associated with it and can't be deleted.
Change 850 has 2 files associated with it and can't be deleted.
Change 849 has 2 files associated with it and can't be deleted.
Change 846 deleted.
Change 845 has 2 files associated with it and can't be deleted.
干杯,
托马斯
这是仅 DOS CMD 的版本。只需替换 %p4streamsUser%。
for /f "tokens=* delims=" %%i in ('p4 changes -u %p4streamsUser% -s pending') do (
for /f "tokens=1-7*" %%a in ("%%i") do (
echo Deleting CL %%b %%h %%f
p4 change -d -f %%b
)
)
我在 Windows 7 机器上。这将适用于其他几个版本的 windows/DOS。