2011-09-18 58 views
4

我需要一个更新后运行的钩子(这将构建他们已更新的解决方案),而且我不想为每个克隆我的中央存储库的人员手动添加该钩子。如何在HG/Mercurial中设置由存储库指定的钩子?

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

我读过关于站点范围的钩子,但据我了解,它们在每个创建的仓库上工作,我只想在某些仓库上挂钩。

回答

10

作为Rudi already said,这是(幸好)由于安全原因不可能。但是,您可以减少每克隆工作负载以手动设置挂接:将挂接脚本作为存储库的一部分发送,例如,在目录.hghooks中,并且在您的回购库中另外包含一个脚本,用于在克隆的hgrc中设置这些钩子。每个同事现在只需要为每个克隆调用一次设置脚本。

+0

这正是我所做的,从回购第一个克隆后,开发者将不得不反正运行安装程序。它创建一个IIS站点,为主机文件添加一个主机名,现在也改变他们的hgrc文件,我从来没有想过在那里添加它,这么简单! – sebastiaan

1

正如@Rudi先说的那样,出于安全考虑不能这样做。

通过一些先前的设置,您可以使钩子在克隆上运行,但在/etc/mercurial或每个用户的~/.hgrc中放置回购相对路径的挂钩,在公司设置中可以通过系统管理工具或通过构建自定义Mercurial安装程序。在非公司背景下,请遵循@ Oben的建议并提供脚本和自述文件。

+0

值得一提的是'/ etc/mercurial'中定义的钩子可以被用户覆盖*(如果他们希望的话) – zerkms

+0

一个很好的观点。你可以帮助人们不要忘记配置钩子,但是你不能让它们在自己的机器上运行。 –

3

这将允许集中的per-repo挂钩,每个用户只需一个设置步骤。然而,它会为与网络断开连接的用户造成问题。另一种方法是,如果你倾向于让断开连接的开发人员(或者高延迟/低带宽链接的开发人员)拥有包含挂钩的repo,并将每个用户的全局hgrc设置为指向该repo(并且需要定期从中央吊钩回购)。

请注意,我将第一次提交的ID视为“回购ID” - 这假设每个存储库中的第一次提交在某些方面是唯一的 - 内容或提交消息。如果情况并非如此,那么您可以做同样的事情,但将其应用于前N个提交 - 但是您必须考虑少于N次提交的回购 - 例如,不能仅以repo[:5]作为新提交更改回购ID。我个人建议第一次提交可能应该是一个标准的.ignore文件,并提供该回购特有的提交消息。

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

  2. 每个用户的总体拥有hgrc:

    %include /path/to/shared_hgrc 
    
  3. 创建的蟒蛇钩子模块共享的存储库。钩子必须用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