7

Perforce を使用すると、変更されていないファイルをチェックインできます。バージョン管理システムがこれを許可する理由は私にはわかりませんが、それは別の質問のトピックです。変更されていないファイルの送信を拒否するトリガーを作成したいと考えています。ただし、Perforce トリガーの経験はありません。私が読んだことから、提出されたファイルは、置き換えようとしているそれぞれのヘッドリビジョンと比較する必要があるため、これは「コンテンツの変更」トリガーになると推測しています。着信ファイルを繰り返し処理し、それらがすべて実際に変更されていることを確認する必要があります。問題は、どうすればいいのかわからないということです。

Perforceトリガーの経験を持つ人は、例を提供したり、少なくとも私を正しい方向に向けることができますか?

4

7 に答える 7

5

最近のバージョンの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%、および場合によっては他の変数を渡して、コストのかかる操作を問題のあるユーザーだけに制限できるようにすることをお勧めします。

于 2008-10-02T14:25:23.827 に答える
1

Perforce の Triggers テーブルを見ると、トリガーは、何らかのイベントが発生したときに呼び出されるスクリプトに過ぎないことがわかります。あなたの場合、 change-content イベントがトリガーされます。

Perforce と対話するスクリプトを作成するには、いくつかのオプションがあります。Perforceのダウンロード ページには、広く使用されている多くの言語のライブラリとモジュールがあります。これはどれもあなたを助け、あなたがしなければならないことを大幅に簡素化します. また、Perforce ドキュメント ページを確認し、管理者ガイドをダウンロードしてください。トリガーの作成方法などを説明します。

基本的に、送信されている変更リストから情報を取得するスクリプトを作成し、その中の各ファイルに対してサーバーに対して「diff」コマンドを実行する必要があります。変更されていないファイルが見つかった場合は、提出を無効にする必要があります。

お気に入りの言語の Perforce モジュールと管理者ガイドが、必要なすべての答えを提供します。

于 2008-10-02T13:33:49.770 に答える
1

トリガーを使用するのではなく、彼のワークスペースを編集して (適切なアクセス許可を持っていると仮定して)、これを回避する送信戦略をデフォルトにすることができます。デフォルトでは (理由はわかりませんが) peforce は、変更されていない場合でも選択されたすべてのファイルを送信しますが、この動作を変更することは可能です。彼のワークスペースを開き、SubmitOptions ドロップダウンを 'revertunchanged' に設定すると、変更リスト内の変更されていないファイルがすべて元に戻されます。

送信時ドロップダウンを見たい場合は、個々のチェンジリスト送信でこれを行うこともできます。

私たちの環境ではこの問題がありましたが、違反者に何が起こっているのか、デフォルトの動作を変更するのがいかに簡単かを説明したところ、問題なく変更されました.

于 2008-10-30T13:38:20.797 に答える
1

change-content トリガーを書きたいと思うでしょう。これらのトリガーは、ファイルがサーバーに転送された後、DB にコミットされる前に実行されます。perforce ドキュメントに従って、次のようなコマンドを使用できます。

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

change-content トリガーでは、@= (change はトリガーに送信されたチェンジリスト番号) は、送信されたファイルの内容を取得します。サーバーのバージョンを確認する方法を探している場合は、次のようなことができるかもしれません

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

-sr コマンドは、開いていて現在のデポの内容と同じであるファイルについて報告します。ファイルはまだコミットされていないので、サーバーに転送された内容がデポの現在のヘッド リビジョンと同じであるファイルのリストを実際に取得すると仮定します。p4 diff -sr が同じファイルを返す場合、ゼロ以外の終了コードを返すと、送信が中止され、ユーザーは変更されていないファイルを手動で元に戻す必要があります。

彼のために元に戻すことによってチェンジリストの内容を実際に変更したいとは思いません。それはあまりにも危険に聞こえます。

意味のある任意の言語でトリガーを記述できることに注意してください (以前の投稿者が示唆したように)。ただし、この種のトリガーはかなりヘビー級になると思います。基本的に、すべてのユーザーに対して送信されたすべてのコンテンツに差分を適用して、開発者が 1 つのステップを踏むようにします。おそらくそれは問題ない価格ですが、ユーザーの数と変更リスト (およびファイル) のサイズによっては、この種のトリガーの実行に時間がかかる場合があります。

于 2008-10-02T22:41:49.780 に答える
0

以下のスクリプトは、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 );
      }
   }

}
于 2011-12-19T20:50:04.673 に答える