我需要一个更新后运行的钩子(这将构建他们已更新的解决方案),而且我不想为每个克隆我的中央存储库的人员手动添加该钩子。如何在HG/Mercurial中设置由存储库指定的钩子?
当有人第一次克隆我的中央存储库时,是否可以将挂钩包含到该克隆中?似乎.hgrc文件不会自动克隆。
我读过关于站点范围的钩子,但据我了解,它们在每个创建的仓库上工作,我只想在某些仓库上挂钩。
我需要一个更新后运行的钩子(这将构建他们已更新的解决方案),而且我不想为每个克隆我的中央存储库的人员手动添加该钩子。如何在HG/Mercurial中设置由存储库指定的钩子?
当有人第一次克隆我的中央存储库时,是否可以将挂钩包含到该克隆中?似乎.hgrc文件不会自动克隆。
我读过关于站点范围的钩子,但据我了解,它们在每个创建的仓库上工作,我只想在某些仓库上挂钩。
作为Rudi already said,这是(幸好)由于安全原因不可能。但是,您可以减少每克隆工作负载以手动设置挂接:将挂接脚本作为存储库的一部分发送,例如,在目录.hghooks
中,并且在您的回购库中另外包含一个脚本,用于在克隆的hgrc
中设置这些钩子。每个同事现在只需要为每个克隆调用一次设置脚本。
这是不可能的,因为钩子不传播到克隆是安全措施。如果可能的话,可以建立一个rouge仓库,它可以在repo被克隆的任何机器上运行任意命令。
查看http://hgbook.red-bean.com/read/handling-repository-events-with-hooks.html#id402330了解更多详情。
正如@Rudi先说的那样,出于安全考虑不能这样做。
通过一些先前的设置,您可以使钩子在克隆上运行,但在/etc/mercurial
或每个用户的~/.hgrc
中放置回购相对路径的挂钩,在公司设置中可以通过系统管理工具或通过构建自定义Mercurial安装程序。在非公司背景下,请遵循@ Oben的建议并提供脚本和自述文件。
值得一提的是'/ etc/mercurial'中定义的钩子可以被用户覆盖*(如果他们希望的话) – zerkms
一个很好的观点。你可以帮助人们不要忘记配置钩子,但是你不能让它们在自己的机器上运行。 –
这将允许集中的per-repo挂钩,每个用户只需一个设置步骤。然而,它会为与网络断开连接的用户造成问题。另一种方法是,如果你倾向于让断开连接的开发人员(或者高延迟/低带宽链接的开发人员)拥有包含挂钩的repo,并将每个用户的全局hgrc设置为指向该repo(并且需要定期从中央吊钩回购)。
请注意,我将第一次提交的ID视为“回购ID” - 这假设每个存储库中的第一次提交在某些方面是唯一的 - 内容或提交消息。如果情况并非如此,那么您可以做同样的事情,但将其应用于前N个提交 - 但是您必须考虑少于N次提交的回购 - 例如,不能仅以repo[:5]
作为新提交更改回购ID。我个人建议第一次提交可能应该是一个标准的.ignore
文件,并提供该回购特有的提交消息。
有一个中央shared_hgrc文件,可以从网络共享(或挂钩回购)访问。
每个用户的总体拥有hgrc:
%include /path/to/shared_hgrc
创建的蟒蛇钩子模块共享的存储库。钩子必须用python编写。
创建您的挂钩函数。在每一个功能,检查其回购的钩子已经呼吁通过检查第一的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,))
在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
这正是我所做的,从回购第一个克隆后,开发者将不得不反正运行安装程序。它创建一个IIS站点,为主机文件添加一个主机名,现在也改变他们的hgrc文件,我从来没有想过在那里添加它,这么简单! – sebastiaan