有没有办法让Mercurial将存储库的工作副本设置为只读,并且要求我在开始编辑之前明确告诉Mercurial我要编辑文件?
我不询问锁定以防止并发编辑,也不会阻止意外更改进入存储库。 这是为了防止工作副本本身发生意外的未提交更改。
我已经尝试创建一个删除只读文件属性的批处理文件checkout.bat和另一个提交更改的checkin.bat,并使文件再次成为只读,但Hg希望文件可写当你做hg更新时。
我知道这不是使用Mercurial的正常方法(并且让我们避免争论是否最好避免checkout-edit-checkin模型)。但是不能选择切换到另一个版本控制系统。 (我在大多数项目中使用TFS,但这个需要Mercurial。)
答案 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_IWUSR
和os.stat()
唯一的标志。在Windows上。)
显然,您也可以通过调整挂钩中的路径将文件放在不同的位置。挂钩也不属于存储库,如果您将存储库克隆到其他位置,则必须再次将它们添加到os.chmod()
文件中。
最后,请注意这里可能会产生性能影响:这些挂钩会在每次更新时两次更改存储库中所有文件的权限,这在大型存储库中可能会很昂贵。
答案 1 :(得分:1)