有没有办法在单个存储库中指定一个钩子?
现在我们已经在"/ etc/mercurial/hgrc"文件中指定了钩子,但每次构建两次时,它都会为每个存储库中的每个提交构建.
所以我们想要为每个存储库指定一个构建.
这就是我们实现钩子的方式:
[hooks]
changegroup = curl --silent http://jenkins:8080/job/ourProject/build
Run Code Online (Sandbox Code Playgroud)
它在Ubuntu服务器上.
我试图创建一个在预提交上运行的Mercurial预提交钩子pylint。我的项目使用虚拟环境。
我已经设置了挂钩来调用pylint更改的文件,但出现错误:
Traceback (most recent call last):
File "/home/barmstrong/.virtualenvs/amp/bin/pylint", line 10, in <module>
sys.exit(run_pylint())
File "/home/barmstrong/.virtualenvs/amp/lib/python3.6/site-packages/pylint/__init__.py", line 20, in run_pylint
Run(sys.argv[1:])
File "/home/barmstrong/.virtualenvs/amp/lib/python3.6/site-packages/pylint/lint.py", line 1583, in __init__
linter.load_plugin_modules(plugins)
File "/home/barmstrong/.virtualenvs/amp/lib/python3.6/site-packages/pylint/lint.py", line 636, in load_plugin_modules
module = modutils.load_module_from_name(modname)
File "/home/barmstrong/.virtualenvs/amp/lib/python3.6/site-packages/astroid/modutils.py", line 202, in load_module_from_name
return load_module_from_modpath(dotted_name.split("."), path, use_sys)
File "/home/barmstrong/.virtualenvs/amp/lib/python3.6/site-packages/astroid/modutils.py", line 244, in load_module_from_modpath
mp_file, mp_filename, mp_desc = imp.find_module(part, path)
File "/usr/lib/python3.6/imp.py", line 297, in find_module
raise ImportError(_ERR_MSG.format(name), name=name)
ImportError: No module named 'common'
Run Code Online (Sandbox Code Playgroud)
我相信这是由于.pylintrc尝试从我的项目目录中加载的文件中的自定义插件所致: …
我已经开始使用Mercurial来控制我的Drupal项目源文件(我既是VCS又是Mercurial新手).但是,数据库仍然使用日期.sql.gz文件的目录进行"版本控制".
我想要的是在我的存储库中的某个地方有一个数据库转储文件,当数据库发生更改时会被当前转储覆盖,并在我想要回滚到另一个版本时导入到数据库中.
我是手动完成的,但它确实有效.但我真正喜欢的是在每次提交/更新时自动执行转储/加载的事情.我真的更喜欢它会挂钩到Mercurial而不是外部像makefile那样首先转储数据库然后提交,因为我喜欢使用TortoiseHg的工具,而且我不想让另一个脚本运行.
现在,似乎mysql .... < dumpfile.sql在update钩子上的东西将是每次更新后加载数据库转储的简单方法.但是自动倾销怎么样?
有一个类似的问题关于SVN的预提交钩子,并且接受的答案是它可能是一个坏主意.它适用于Mercurial吗?也许另一个钩子(prechangegroup?)会起作用?
编辑:
我应该指出,我自己在我的本地机器上使用它.它不应该扩展到单个用户之外.
我有一个像这样的 mercurial 钩子:
[hooks]
pretxncommit.myhook = python:path/to/file:myhook
Run Code Online (Sandbox Code Playgroud)
代码如下所示:
def myhook(ui, repo, **kwargs):
#do some stuff
Run Code Online (Sandbox Code Playgroud)
但是这个钩子在使用提交逻辑做其他事情的命令上运行,在我的例子中hg shelve。有没有办法获取用户输入的命令以避免在该命令上运行挂钩?
也许是这样的:
def myhook(ui, repo, command, **kwargs):
if command is "hg shelve"
return 0
#do some stuff
Run Code Online (Sandbox Code Playgroud) 我正在尝试寻找是否有一种简单的方法可以使 Mercurial 存储库变为只读。用户应该能够克隆,但不允许推送。我需要对超过 100 个的所有存储库执行此操作。
我正在尝试在Windows上运行Mercurial进程内挂钩.
问题不在于如何编写钩子(我想使用现有的钩子,在这种情况下BugTracker.Net的钩子用于Mercurial集成 - 我没有找到该文件的直接链接,但你可以看到它如果你在这里下载BT.net ,它位于"mercurial"子文件夹中.
问题是如何告诉Mercurial运行它.
我花了很长时间阅读文档,但我现在卡住了.
(使用Python的某些知识可能会更容易 - 我没有)
我知道我必须在hgrc文件中插入一行(在我的存储库的.hg文件夹中).
HG Book中有一个例子如下:
[hooks]
commit.example = python:mymodule.submodule.myhook
Run Code Online (Sandbox Code Playgroud)
还有Mercurial网站上的另一个例子,它看起来像这样:
[hooks]
changegroup = /path/to/changegrouphook
Run Code Online (Sandbox Code Playgroud)
现在我想要一个"传入"钩子,所以至少我知道我必须这样做:
[hooks]
incoming.btnet = X
Run Code Online (Sandbox Code Playgroud)
问题是找出"X".
文件名是hg_hook_for_btnet.py,在文件中有一行如下所示:
def debug_out(s):
Run Code Online (Sandbox Code Playgroud)
我想这就是"功能"本身的名称.
所以我的行需要看起来像这样:
[hooks]
incoming.btnet = python:hg_hook_for_btnet.debug_out
Run Code Online (Sandbox Code Playgroud)
但是这给了我一个错误信息[Errno 2]当我推送时没有这样的文件或目录.
我已经尝试了很多不同的变化,但它不起作用,我不知道我做错了什么.
另外,我是否将钩子文件放入正确的文件夹中?
现在,它位于我的存储库的主文件夹中(与.hg文件夹位于同一级别).
编辑:
马丁,我改成了这个:
[hooks]
incoming.btnet = python:~c:\HG\MyRepo\hg_hook_for_btnet.py:debug_out
Run Code Online (Sandbox Code Playgroud)
现在我得到一个不同的消息: …
我需要在更新后运行一个钩子(这将构建他们已经更新的解决方案)并且我不想为每个克隆我的中央存储库的人手动添加该钩子.
当有人第一次克隆我的中央存储库时,是否可以在该克隆中包含挂钩?似乎.hgrc文件不会自动克隆.
我确实阅读过有关站点范围内的钩子,但据我所知,它们可以在每个创建的存储库上工作,我只想在某些存储库中使用钩子.
我本质上是在寻找一种管理特定分支的写入权限的方法。
这可以在提交之前(本地),也可以在提交之后但推送之前(远程)。
我需要保护某些分支不被写入,以便强制执行发布分支只能由某些人编辑的工作流程。
我刚开始使用Mercurial作为源控制系统.我正在考虑使用类似于此处概述的工作流程:http://stevelosh.com/blog/2010/05/mercurial-workflows-stable-default/.基本上,有两个分支,一个是"稳定",一个是"发展".所有开发都将在"开发"分支上完成,并且只有在经过测试并准备发布时才会合并到"稳定"分支中.
o | v2.0
|\|
| o added new feature
o | V1.0
|\|
| o added new feature
| |
| o fixed bug
o |
Run Code Online (Sandbox Code Playgroud)
我想阻止开发人员意外地将更改推送到稳定分支.我怎样才能做到这一点?我知道有一些方法可以勾勒出某些Mercurial事件,但如果它改变了稳定分支,哪一个可以拒绝推动?如何检测钩子内某些分支的变化?
顺便说一句,我正在运行Windows 7.
感谢criswel的回答 - 它指出了我正确的方向.原来ACL扩展(mercurial附带)解决了这个问题.我在主repo的'.hg'文件夹中编辑了'hgrc'文件,如下所示:
[extensions]
acl =
[hooks]
pretxnchangegroup.acl = python:hgext.acl.hook
[acl]
sources = push
[acl.deny.branches]
stable = *
Run Code Online (Sandbox Code Playgroud)
这会阻止任何人对稳定分支进行更改并将其推送到主仓库.
有没有办法在执行推送之前先勾上钩子。例如,当我键入代码时,我想在代码库上运行JSHint;hg push发现任何错误时,我将中止推送。
我首先尝试使用pre-commit钩子。那行得通,但是在每次提交之前等待几秒钟是很麻烦的。此外,我有时会用可能损坏的代码进行中间提交。
阅读我发现的hgrc文档preoutgoing,pre-outgoing这似乎是我想要的东西。但是这些没有用。他们似乎唯一要做的就是在键入时运行钩子:
hg outgoing
Run Code Online (Sandbox Code Playgroud)
对我完全没有用。