【问题标题】:Perforce trigger to deny submission of unchanged files?Perforce触发器拒绝提交未更改的文件?
【发布时间】:2008-10-02 13:05:35
【问题描述】:

Perforce 允许人们签入未更改的文件。为什么任何版本控制系统都允许这样做超出了我的范围,但这是另一个问题的主题。我想创建一个触发器,拒绝提交未更改的文件。但是,我没有使用 Perforce 触发器的经验。从我读到的内容来看,我猜这将是一个“更改内容”触发器,因为提交的文件必须与它们将要替换的相应的头部修订进行比较。我需要遍历传入的文件并确保它们确实都发生了变化。问题是,我不知道该怎么做。

任何有 Perforce 触发器经验的人都可以提供一个例子或至少为我指明正确的方向吗?

【问题讨论】:

  • 嗨,我偶然发现了你去年提出的问题。只是评论:在我看来,创建文件的“空增量”(即文件的未更改版本)以使 p4 相信分支上的合并已经通过 integ 命令发生(即使您没有合并任何内容并保持您的分支版本不变),因此随后使用 integ 命令继续从分支到分支进行合并不会检测到文件上的冲突 - 因为 P4 会相信它是合并在过去。如果我错了,请纠正我,但这是我从基础培训课程中所理解的。

标签: triggers perforce


【解决方案1】:

在最新版本的 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's documentation 以了解详细信息,但您需要更改内容触发器。

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

【讨论】:

    【解决方案2】:

    如果您查看 Perforce 中的触发器表,您会发现触发器只是在某种事件发生时被调用的脚本。在您的情况下,会触发 change-content 事件。

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

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

    您最喜欢的语言的 Perforce 模块和管理员指南将为您提供所需的所有答案。

    【讨论】:

      【解决方案3】:

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

      p4 diff //depot/path/...@=<change>
      

      在更改内容触发器中,@=(其中更改是发送到触发器的更改列表编号)将为您提供已提交文件的内容。如果您正在寻找一种检查服务器版本的方法,您可以执行类似的操作

      p4 diff -sr //...@=<change>
      

      -sr 命令将报告打开的文件并与当前 depot 内容相同。由于这些文件尚未提交,我将假设您实际上将获得一个文件列表,这些文件的内容已传输到服务器与软件仓库中的当前头版本相同。如果 p4 diff -sr 返回任何相同的文件,则返回非零退出代码,提交将暂停,用户必须手动恢复其未更改的文件。

      我认为您不想通过为他执行还原来实际修改更改列表的内容。这听起来太危险了。

      请注意,您可以使用任何有意义的语言编写触发器(如之前的海报所建议的那样)。我确实认为这种触发器将是相当重量级的。本质上,您将对所有用户提交的所有内容实施差异化,以便让一个开发人员步入一致。也许这是一个不错的代价,但根据用户数量和他们的变更列表(和文件)的大小,这种触发器可能需要很长时间才能运行。

      【讨论】:

      • 我为了降低成本,你可以将 %user% 传递给触发脚本,然后只有在 %user% 匹配问题用户时才进行代价高昂的变更评估。
      • 那应该是“按顺序”而不是“我订购”。
      • 是的,好点。如果您想将其限制为一个用户或一组特定用户,这将有所帮助。
      【解决方案4】:

      您可以编辑他的工作区(假设您有正确的权限)而不是使用触发器,以默认使用避免这种情况的提交策略。默认情况下(同样我不知道为什么)peforce 将提交所有选定的文件,即使未更改,但可以更改此行为。打开他的工作区,并将 SubmitOptions 下拉菜单设置为“revertunchanged”,这将恢复更改列表中未更改的所有文件,或“leaveunchanged”,这将使它们保持签出但不提交。

      如果他希望仅查看 On Submit 下拉菜单,也可以在单个更改列表提交上执行此操作。

      我们在我们的环境中遇到了这个问题,但是一旦我向违规者解释了发生了什么以及更改默认行为是多么容易,他们就毫无问题地更改了。

      【讨论】:

        【解决方案5】:

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

        作为管理员用户,输入 p4 triggers

        将此添加到脚本的Triggers: 行下。

        Trigger_name change-content //... "/&lt;path_to_trigger_script&gt;/&lt;script_name&gt; %changelist% %serverhost% %serverport% %user%"

        Trigger_name 是任意的。 //... 表示所有版本化文件,但您可以根据需要进行修改。 % 包围的任何内容都是 Perforce 独有的特殊变量名,这些将是您脚本的参数。这些应该是你所需要的。请注意,&lt;&gt; 包围的任何内容都是可变的,并且取决于您的环境。

        现在,对于脚本本身。这是我写的。

        #!/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 );
              }
           }
        
        }
        

        【讨论】:

          【解决方案6】:

          我们有一个触发脚本,它首先检查客户端规范的 SubmitOptions 是否存在 submitunchanged。如果不存在,则触发脚本可以退出,因为用户无法提交未更改的文件。否则,我们会检查所有编辑操作且文件类型未更改的文件。我们将此类文件与之前的版本进行比较。

          【讨论】:

            【解决方案7】:

            将此添加到您的triggers 表中:

            Triggers:
                myTrigger form-in client "sed -i -e s/submitunchanged/leaveunchanged/ %formfile%"
            

            这将阻止任何人使用submitunchanged 选项保存客户端,从而使他们难以提交未更改的文件。

            【讨论】:

              猜你喜欢
              • 2014-07-31
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多