使用Mercurial

时间:2015-10-14 09:34:05

标签: mercurial

有没有办法让Mercurial将存储库的工作副本设置为只读,并且要求我在开始编辑之前明确告诉Mercurial我要编辑文件?

询问锁定以防止并发编辑,也不会阻止意外更改进入存储库。 这是为了防止工作副本本身发生意外的未提交更改。

我已经尝试创建一个删除只读文件属性的批处理文件checkout.bat和另一个提交更改的checkin.bat,并使文件再次成为只读,但Hg希望文件可写当你做hg更新时。

我知道这不是使用Mercurial的正常方法(并且让我们避免争论是否最好避免checkout-edit-checkin模型)。但是不能选择切换到另一个版本控制系统。 (我在大多数项目中使用TFS,但这个需要Mercurial。)

2 个答案:

答案 0 :(得分:2)

您可能最好使用一对*@Route("/edit", name="edit_form") preupdate挂钩,其中第一个使存储库中的所有文件都可写,第二个使它们只读。

例如:

update

因为你似乎在使用Windows,所以Unix shell脚本可能不是最好的解决方案,你可能不得不恢复到Python(使用Python也可以消除两次​​调用[hooks] preupdate = hg files -0 | xargs -0 chmod u+w 2>/dev/null || true update = hg files -0 | xargs -0 chmod u-w 2>/dev/null || true 的开销)。这将是以下几点:

hg

这需要[hooks] preupdate = python:.hg/pyhooks.py:make_writable update = python:.hg/pyhooks.py:make_readonly 中的pyhooks.py文件,其中包含以下内容:

.hg

上面的代码仍然是针对Unix编写的,但也适用于Windows(至少根据文档,import os, stat from mercurial import scmutil def make_writable(ui, repo, hooktype, node=None, source=None, **kwargs): ctx = scmutil.revsingle(repo, ".") for f in ctx: try: perm = os.stat(f)[0] os.chmod(f, perm | stat.S_IWUSR) except: pass def make_readonly(ui, repo, hooktype, node=None, source=None, **kwargs): ctx = scmutil.revsingle(repo, ".") wflags = stat.S_IWUSR or stat.S_IWGRP or stat.S_IWOTH for f in ctx: try: perm = os.stat(f)[0] os.chmod(f, perm & ~wflags) except: pass S_IWRITE == S_IWUSRos.stat()唯一的标志。在Windows上。)

显然,您也可以通过调整挂钩中的路径将文件放在不同的位置。挂钩也不属于存储库,如果您将存储库克隆到其他位置,则必须再次将它们添加到os.chmod()文件中。

最后,请注意这里可能会产生性能影响:这些挂钩会在每次更新时两次更改存储库中所有文件的权限,这在大型存储库中可能会很昂贵。

答案 1 :(得分:1)

只要在Mercurial存储库或工作副本上执行某些操作,就会调用许多hooks。你需要的是一个update钩子,理论上你可以改变属性。

请注意,默认情况下,挂钩是“本地”,这意味着它们不会传播到存储库的克隆。要解决这个问题,我们可以使用ProjRc扩展程序来“分发”挂钩设置。