4

我需要在更新后运行一个挂钩(这将构建他们更新的解决方案),我不想为每个克隆我的中央存储库的人手动添加该挂钩。

当有人第一次克隆我的中央存储库时,是否可以在该克隆中包含挂钩?似乎 .hgrc 文件不会自动克隆。

我确实读过关于站点范围的钩子,但据我了解,它们适用于每个创建的存储库,我只想在某些存储库上使用钩子。

4

4 回答 4

10

正如鲁迪已经说过的那样,出于安全原因,这(谢天谢地)是不可能的。

但是,您可以减少每个克隆的工作量以手动设置挂钩:将挂钩脚本作为存储库的一部分发送,例如在目录.hghooks中,并在您的存储库中另外包含一个脚本,该脚本在克隆中设置这些挂钩hgrc。现在,每个同事每次克隆只需调用一次设置脚本。

于 2011-09-18T18:33:31.537 回答
4

这是不可能的,因为钩子不会传播到克隆是一种安全措施。如果这是可能的,可以建立一个 rouge 存储库,它可以在任何克隆了 repo 的机器上运行任意命令。

有关详细信息,请参阅http://hgbook.red-bean.com/read/handling-repository-events-with-hooks.html#id402330 。

于 2011-09-18T16:42:01.820 回答
3

这将允许集中的 per-repo 挂钩,每个用户只需一个设置步骤。但是,它会给与网络断开连接的用户带来问题。如果您倾向于让开发人员断开连接(或通过高延迟/低带宽链接的开发人员),另一种选择是拥有一个包含挂钩的 repo,并设置每个用户的全局 hgrc 以指向该 repo(并需要定期从中央挂钩回购)。

请注意,我将第一次提交的 ID 视为“repo ID”——这假设每个存储库中的第一次提交在某种程度上是唯一的——内容或提交消息。如果不是这种情况,您可以做同样的事情,但将其应用于前 N 次提交 - 但是您必须考虑少于 N 次提交的存储库 - 不能仅仅以repo[:5]较新的提交为例回购 ID。我个人建议第一次提交可能应该是一个标准.ignore文件,其中包含该 repo 独有的提交消息。

  1. 有一个中央 shared_hgrc 文件,可从网络共享(或挂钩 repo)访问。

  2. 每个用户的全局 hgrc 有:

    %include /path/to/shared_hgrc
    
  3. 创建 python 钩子模块的共享存储库。钩子必须用 python 编写。

  4. 创建你的钩子函数。在每个函数中,通过检查第一次提交的 ID 来检查钩子调用了哪个 repo:

    # 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.水银安装程序。在非公司环境中,请遵循 @Oben 的建议并提供脚本和自述文件。

于 2011-09-18T19:13:34.063 回答