Perforce 允许人们签入未更改的文件。为什么任何版本控制系统都允许这样做超出了我的范围,但这是另一个问题的主题。我想创建一个触发器,拒绝提交未更改的文件。但是,我没有使用 Perforce 触发器的经验。从我读到的内容来看,我猜这将是一个“更改内容”触发器,因为提交的文件必须与它们将要替换的相应的头部修订进行比较。我需要遍历传入的文件并确保它们确实都发生了变化。问题是,我不知道该怎么做。
任何有 Perforce 触发经验的人都可以提供一个例子或至少为我指明正确的方向吗?
在最新版本的 perforce 中,允许客户端设置阻止提交未更改的文件:
SubmitOptions: Flags to change submit behaviour.
submitunchanged All open files are submitted
submitunchanged+reopen (default).
revertunchanged Files that have content or type
revertunchanged+reopen changes are submitted. Unchanged
files are reverted.
leaveunchanged Files that have content or type
leaveunchanged+reopen changes are submitted. Unchanged
files are moved to the default
changelist.
+reopen appended to the submit option flag
will cause submitted files to be
reopened on the default changelist.
这可能是一种调查用户是否只是因为冷漠而检查未更改文件的途径。
编辑:
鉴于您想要强制执行限制而不管用户的工作区设置如何,那么您将需要一个触发器,如其他答案中所建议的那样。
您需要查看Perforce 的文档以了解详细信息,但您需要更改内容触发器。
您可能希望传递 %user% 以及 %change% 以及可能的其他变量,以便您可以将昂贵的操作限制为问题用户。
您需要编写一个更改内容触发器。这些触发器在文件传输到服务器之后、提交到数据库之前运行。根据 perforce 文档,您可以使用类似于以下的命令
p4 diff //depot/path/...@=<change>
在更改内容触发器中,@=(其中更改是发送到触发器的更改列表编号)将为您提供已提交文件的内容。如果您正在寻找一种检查服务器版本的方法,您可以执行类似的操作
p4 diff -sr //...@=<change>
-sr 命令将报告打开且与当前 depot 内容相同的文件。由于这些文件尚未提交,我将假设您实际上将获得一个文件列表,这些文件的内容已传输到服务器与软件仓库中的当前头版本相同。如果 p4 diff -sr 返回任何相同的文件,则返回非零退出代码,提交将暂停,用户将不得不手动恢复其未更改的文件。
我认为您不想通过为他进行还原来实际修改更改列表的内容。这听起来太危险了。
请注意,您可以用任何有意义的语言编写触发器(如之前的海报所建议的那样)。我确实认为这种触发器将是相当重量级的。本质上,您将对所有用户提交的所有内容实施差异化,以便让一个开发人员步入一致。也许这是一个不错的代价,但根据用户数量和他们的变更列表(和文件)的大小,这种触发器可能需要很长时间才能运行。
您可以编辑他的工作区(假设您拥有正确的权限),而不是使用触发器,以默认使用避免这种情况的提交策略。默认情况下(同样我不知道为什么)peforce 将提交所有选定的文件,即使未更改,但可以更改此行为。打开他的工作区,并将 SubmitOptions 下拉设置为“revertunchanged”,这将恢复更改列表中未更改的所有文件,或“leaveunchanged”,这将使它们保持签出但不提交。
如果他希望只查看 On Submit 下拉菜单,也可以在单个更改列表提交上执行此操作。
我们在我们的环境中遇到了这个问题,但是一旦我向违规者解释了发生了什么以及更改默认行为是多么容易,他们就毫无问题地更改了默认行为。
如果您查看 Perforce 中的 Triggers 表,您会发现触发器只不过是在某种事件发生时被调用的脚本。在您的情况下,会触发 change-content 事件。
您有多种选择来编写与 Perforce 交互的脚本。Perforce 下载页面包含许多广泛使用的语言的库和模块。任何这些都将帮助您并大大简化您需要做的事情。此外,查看Perforce 文档页面并下载管理员指南。它将解释如何创建触发器等。
基本上,您需要编写一个脚本,该脚本将从正在提交的更改列表中获取信息,并为其中的每个文件对服务器运行“diff”命令。如果你发现一个没有变化的文件,你需要使提交无效。
您最喜欢的语言的 Perforce 模块和管理员指南将为您提供所需的所有答案。
下面的脚本是在 Linux 中使用 perl 脚本完成的。我相信您可以根据需要在 Windows 中调整它并使用 Perl 以外的脚本语言。
作为管理员用户,键入
p4 triggers
。
Triggers:
在脚本行下添加它。
Trigger_name change-content //... "/<path_to_trigger_script>/<script_name> %changelist% %serverhost% %serverport% %user%"
Trigger_name
是任意的。这//...
意味着您的所有版本控制文件,但您可以根据需要对其进行修改。周围的任何内容%
都是 Perforce 独有的特殊变量名,这些将是您脚本的参数。这些应该是你所需要的。请注意,周围的任何东西<>
都是可变的,并且取决于您的环境。
现在,对于脚本本身。这是我写的。
#!/usr/bin/perl
# ----- CHECK 1 : Make sure files NOT identical
# get variables passed in through triggers call 'p4 triggers'
$ChangeNum = $ARGV[0]; #change number
$Server = $ARGV[1];
$Port = $ARGV[2];
$User = $ARGV[3];
$p4 = "<path_to_p4_exec>/p4 -p $Port ";
# get list of files opened under the submitted changelist
@files = `$p4 opened -a -c $ChangeNum | cut -f1 -d"#"`;
# go through each file and compare to predecessor
# although workspace should be configured to not submit unchanged files
# this is an additional check
foreach $file (@files)
{
chomp($file);
# get sum of depot file, the #head version
$depotSum = `$p4 print -q $file\#head | sum`;
# get sum of the recently submitted file, use @=$ChangeNum to do this
$clientSum = `$p4 print -q $file\@=$ChangeNum | sum`;
chomp $depotSum;
chomp $clientSum;
# if 2 sums are same, issue error
if ( $depotSum eq $clientSum )
{
# make sure this file is opened for edit and not for add/delete
if ( `$p4 describe $ChangeNum | grep "edit"` )
{
printf "\nFile $file identical to predecessor!";
exit( 1 );
}
}
}
我们有一个触发脚本,它首先检查客户端规范的 SubmitOptions 是否存在 submitunchanged。如果不存在,则触发脚本可以退出,因为用户无法提交未更改的文件。否则,我们会检查所有编辑操作且文件类型未更改的文件。我们将此类文件与以前的版本进行比较。
将此添加到您的triggers
表中:
Triggers:
myTrigger form-in client "sed -i -e s/submitunchanged/leaveunchanged/ %formfile%"
这将阻止任何人使用该submitunchanged
选项保存客户端,从而使他们难以提交未更改的文件。