Triggers Perforce触发器是否拒绝提交未更改的文件?

Triggers Perforce触发器是否拒绝提交未更改的文件?,triggers,perforce,Triggers,Perforce,Perforce允许用户签入未更改的文件。我无法理解为什么任何版本控制系统都会允许这样做,但这是另一个问题的主题。我想创建一个触发器,它将拒绝提交未更改的文件。但是,我没有使用Perforce触发器的经验。根据我所读到的,我猜这将是一个“更改内容”触发器,因为提交的文件必须与它们将要替换的相应头部修订有所不同。我需要对传入的文件进行迭代,确保它们确实都已更改。问题是,我不知道该怎么做 任何有过Perforce触发器经验的人都可以举个例子,或者至少为我指出正确的方向吗?如果你查看Perforce中

Perforce允许用户签入未更改的文件。我无法理解为什么任何版本控制系统都会允许这样做,但这是另一个问题的主题。我想创建一个触发器,它将拒绝提交未更改的文件。但是,我没有使用Perforce触发器的经验。根据我所读到的,我猜这将是一个“更改内容”触发器,因为提交的文件必须与它们将要替换的相应头部修订有所不同。我需要对传入的文件进行迭代,确保它们确实都已更改。问题是,我不知道该怎么做


任何有过Perforce触发器经验的人都可以举个例子,或者至少为我指出正确的方向吗?

如果你查看Perforce中的触发器表,你会发现触发器只是在某种事件发生时被调用的脚本。在您的情况下,将触发更改内容事件

您有几个选项可以编写与Perforce交互的脚本。具有许多广泛使用的语言的库和模块。所有这些都将帮助您并大大简化您需要做的事情。此外,请查看并下载管理员指南。它将解释如何创建触发器等

基本上,您需要编写一个脚本,从正在提交的更改列表中获取信息,并针对其中的每个文件对服务器运行一个“diff”命令。如果发现未更改的文件,则需要使提交无效


您最喜欢的语言上的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.
如果用户只是因为冷漠而检查未更改的文件,这可能是一个调查的途径

编辑:

如果您想强制执行该限制,而不考虑用户的工作区设置,那么您将需要一个触发器,如其他答案中所建议的那样

您需要查看以确定详细信息,但需要更改内容触发器


您可能希望传入%user%和%change%以及其他可能的变量,以便将昂贵的操作仅限于有问题的用户。

您需要编写更改内容触发器。这些触发器在文件传输到服务器之后,但在提交到数据库之前运行。根据perforce文档,您可以使用类似于以下命令的命令

p4 diff //depot/path/...@=<change>
p4 diff//depot/path/@=
在change content触发器中,@=(其中change是发送到触发器的变更列表编号)将获取已提交文件的内容。如果您正在寻找一种对照服务器版本进行检查的方法,您可能可以执行以下操作

p4 diff -sr //...@=<change>
p4 diff-sr/@=
-sr命令将报告打开的文件以及与当前仓库内容相同的文件。由于文件尚未提交,我将假设您将实际获得一个文件列表,其中传输到服务器的内容与仓库中当前的head版本相同。如果p4 diff-sr返回任何相同的文件,则返回非零退出代码,提交将停止,用户必须手动恢复其未更改的文件

我认为您不希望通过为他执行恢复来修改变更列表的内容。那听起来太危险了


请注意,您可以用任何有意义的语言编写触发器(如前一张海报所示)。我确实认为这种触发器将是相当重的。实际上,您将在为所有用户提交的所有内容上强制执行一个diff,以使一个开发人员的步骤一致。也许这是一个可以接受的代价,但根据用户数量及其变更列表(和文件)的大小,这种触发器可能需要很长时间才能运行。

您可以编辑他的工作区(假设您拥有正确的权限),以默认为避免这种情况的提交策略。默认情况下(我也不知道为什么),peforce将提交所有选定的文件,即使没有更改,但可以更改此行为。打开他的工作区,并将SubmitOptions下拉列表设置为“revertunchanged”,这将还原更改列表中未更改的任何文件,或设置为“leaveunchanged”,这将使文件保持签出状态,但不会提交

如果他希望查看on submit(提交时)下拉列表,也可以在单个变更列表提交时执行此操作


我们的环境中存在这个问题,但有一次我向违规者解释了发生了什么,以及如何轻松地更改他们更改的默认行为,而没有任何问题。

下面的脚本是在Linux中使用perl脚本完成的。我相信您可以根据需要在Windows中修改它,并使用Perl以外的脚本语言

作为管理员用户,键入
p4触发器

将其添加到脚本的
触发器:
行下

触发名称更改内容//。。。“//%changelist%%serverhost%%serverport%%user%%”

触发器名称是任意的。
/…
表示所有版本化文件,但您可以根据需要修改它。由
%
包围的任何内容都是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 );
      }
   }

}
#/usr/bin/perl
#-----检查1:确保文件不相同
#获取通过触发器调用“p4触发器”传入的变量
$ChangeNum=$ARGV[0]#换号码
$Server=$ARGV[1];
$Port=$ARGV[2];
$User=$ARGV[3
Triggers:
    myTrigger form-in client "sed -i -e s/submitunchanged/leaveunchanged/ %formfile%"