4

更新後にフックを実行する必要があり (これにより、更新されたソリューションがビルドされます)、中央リポジトリを複製する人ごとにそのフックを手動で追加する必要はありません。

誰かが私の中央リポジトリを最初にクローンするとき、そのクローンにフックを含めることは可能ですか? .hgrc ファイルが自動的に複製されないようです。

私はサイト全体のフックについて読みましたが、私が理解している限り、それらは作成された各リポジトリで機能し、いくつかのリポジトリにフックを入れたいだけです。

4

4 に答える 4

10

Rudi が既に述べたように、これは (ありがたいことに) セキュリティ上の理由から不可能です。

ただし、クローンごとのワークロードを減らして手動でフックをセットアップすることもできます。フック スクリプトをリポジトリの一部として (ディレクトリ.hghooksなど) に配布し、これらのフックをクローンの にセットアップするスクリプトをリポジトリに追加しますhgrc。各同僚は、クローンごとにセットアップ スクリプトを 1 回呼び出すだけで済みます。

于 2011-09-18T18:33:31.537 に答える
4

フックがクローンに伝播しないのはセキュリティ対策であるため、これは不可能です。これが可能であれば、リポジトリが複製された任意のマシンで任意のコマンドを実行する rouge リポジトリを設定できます。

詳細については、 http://hgbook.red-bean.com/read/handling-repository-events-with-hooks.html#id402330を参照してください。

于 2011-09-18T16:42:01.820 に答える
3

これにより、ユーザーごとに1つのセットアップ手順で、リポジトリごとのフックを一元化できます。ただし、ネットワークから切断されているユーザーには問題が発生します。開発者(または高遅延/低帯域幅リンクを介した開発者)を切断する傾向がある場合の代替手段は、フックを含むリポジトリを用意し、そのリポジトリを指すように各ユーザーのグローバルhgrcを設定することです(そして、中央フックリポジトリ)。

最初のコミットのIDを「リポジトリID」として扱うことに注意してください。これは、各リポジトリの最初のコミットが何らかの方法で一意であることを前提としています-コンテンツまたはコミットメッセージ。そうでない場合は、同じことを行うことができますが、最初のN個のコミットに適用します-ただし、N個未満のコミットを持つリポジトリを考慮する必要があります-repo[:5]たとえば、新しいコミットが変更されるため、単に取ることができませんリポジトリID。個人的には、最初のコミットは、おそらく.ignoreそのリポジトリに固有のコミットメッセージを含む標準ファイルである必要があることをお勧めします。

  1. ネットワーク共有(またはフックリポジトリ)からアクセスできる中央のshared_hgrcファイルを用意します。

  2. 各ユーザーのグローバルhgrcには次のものがあります。

    %include /path/to/shared_hgrc
    
  3. Pythonフックモジュールの共有リポジトリを作成します。フックはPythonで作成する必要があります。

  4. フック関数を作成します。各関数で、最初のコミットのIDを確認して、フックが呼び出されたリポジトリを確認します。

    # hooktest.py
    
    import mercurial.util
    
    FOOBAR_REPO = 'b88c69276866d73310be679b6a4b40d875e26d84'
    
    ALLOW_PRECOMMIT_REPOS = set((
        FOOBAR_REPO,
    ))
    
    def precommit_deny_if_wrong_repo(ui, repo, **kwargs):
        """Aborts if the repo is not allowed to do this.
        The repo ID is the ID of the first commit to the repo."""
    
        repo_id = repo[0].hex().lower()
    
        if repo_id not in ALLOW_PRECOMMIT_REPOS:
            raise mercurial.util.Abort('Repository denied: %s' % (repo_id,))
    
        ui.status('Repository allowed: %s\n' % (repo_id,))
    
    def precommit_skip_if_wrong_repo(ui, repo, **kwargs):
        """Skips the hook if the repo is not allowed to do this.
        The repo ID is the ID of the first commit to the repo."""
    
        repo_id = repo[0].hex().lower()
    
        if repo_id not in ALLOW_PRECOMMIT_REPOS:
            ui.debug('Repository hook skipped: %s\n' % (repo_id,))
            return
    
        ui.status('Repository hook allowed: %s\n' % (repo_id,))
    
  5. shared_hgrcファイルで、必要なフックを設定します(競合を防ぐために、フック名を修飾していることを確認してください)。

    [hooks]
    pre-commit.00_skip = python:/path/to/hooktest.py:precommit_skip_if_wrong_repo
    pre-commit.01_deny = python:/path/to/hooktest.py:precommit_deny_if_wrong_repo
    
于 2011-09-18T23:06:55.387 に答える
1

@Rudi が最初に言ったように、セキュリティ上の理由から実行できません。

いくつかの事前設定により、フックがクローンで実行されるようにすることができますが、リポジトリ相対パスを持つフックを/etc/mercurial各ユーザーの 内または各ユーザーに配置します~/.hgrc。これは、企業の設定では、システム管理ツールを介して、またはカスタムを構築することによって実行できます。 Mercurial インストーラー。企業以外の設定では、@Oben のアドバイスに従い、スクリプトと readme を提供してください。

于 2011-09-18T19:13:34.063 に答える