我们的远程存储库上有一个钩子设置,可以在收到推送后自动更新回购。它工作得很好,除非我们在本地删除文件然后推送。我们收到这样的消息:
remote: local changed path/to/file/file.ext which remote deleted
remote: use (c)hanged version or (d)elete? c
它自动挑选'c'。我们有办法让Mercurial使用'd'并删除文件吗?
这里有钩子,也发表在评论中,但希望在这里保留换行符:
[hooks]
changegroup = hg update >&2
incoming = /path/filename.sh > /dev/null 2>&1
.h文件在hg更新后重置某些权限。
答案 0 :(得分:0)
错误消息表示“您的本地工作副本包含更新尝试删除的已修改文件。”
如果在远程服务器(即远程存储库内)上运行“hg st”,则应该看到已修改的文件。请注意,更改文件的权限被视为更改。
所以会发生这样的事情:
Mercurial始终尝试防止数据丢失,因此默认选项是“保留本地更改”(因为如果您愿意,您可以随后删除这些文件,但您可能无法恢复它们。)
你能做什么?
不是“修复”远程仓库的权限,而是拒绝接受具有错误权限的变更集。也就是说,不是修复权限,而是在pretxnchangegroup
挂钩中检查它们。如果权限错误,则中止。这样,只要权限被破坏,就无法推送。 Docs
不是修改工作副本,而是将文件复制到新位置并更改其中的权限。这浪费了一些磁盘空间(但是如果使用软链接或硬链接,则不会像你想象的那么多),但它会分散关注点(版本化文件的特殊权限)。
<强> [编辑] 强>
新文件,在本地添加然后推送到远程仓库,松散执行权限。
他们不会失去它,他们首先没有它:Windows不支持这个Unix功能。
不幸的是,you can't tell Mercurial to set the bit from Windows。
要正确解决此问题,请使用以下方法:
如果在Windows上修改文件,Mercurial将保留执行位。
我建议将最后两步放入脚本中。我认为你不能完全自动化它;当某人在运行时推动更改时,脚本会(经常?)失败。
PS:我已提交功能请求,要求提供更好的解决方案:Provide a way to modify the Unix permissions from Windows
答案 1 :(得分:0)
一位同事向我指出了这一点,这可能是我们的解决方案:
https://bz.mercurial-scm.org/show_bug.cgi?id=3302
https://www.mercurial-scm.org/repo/hg/rev/95e45abe7e8e
我们还没有尝试,但我会在做完之后再回复。