Mercurial:远程hg更新挂钩后强制删除

时间:2012-10-09 15:57:27

标签: mercurial mercurial-hook

我们的远程存储库上有一个钩子设置,可以在收到推送后自动更新回购。它工作得很好,除非我们在本地删除文件然后推送。我们收到这样的消息:

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更新后重置某些权限。

2 个答案:

答案 0 :(得分:0)

错误消息表示“您的本地工作副本包含更新尝试删除的已修改文件。”

如果在远程服务器(即远程存储库内)上运行“hg st”,则应该看到已修改的文件。请注意,更改文件的权限被视为更改。

所以会发生这样的事情:

  • 您当地的Mercurial将文件推送到远程存储库
  • 钩子更改远程存储库中的文件(通过修改其权限)。
  • 有人试图删除其中一个文件

Mercurial始终尝试防止数据丢失,因此默认选项是“保留本地更改”(因为如果您愿意,您可以随后删除这些文件,但您可能无法恢复它们。)

你能做什么?

  • 不是“修复”远程仓库的权限,而是拒绝接受具有错误权限的变更集。也就是说,不是修复权限,而是在pretxnchangegroup挂钩中检查它们。如果权限错误,则中止。这样,只要权限被破坏,就无法推送。 Docs

  • 不是修改工作副本,而是将文件复制到新位置并更改其中的权限。这浪费了一些磁盘空间(但是如果使用软链接或硬链接,则不会像你想象的那么多),但它会分散关注点(版本化文件的特殊权限)。

<强> [编辑]

  

新文件,在本地添加然后推送到远程仓库,松散执行权限。

他们不会失去它,他们首先没有它:Windows不支持这个Unix功能。

不幸的是,you can't tell Mercurial to set the bit from Windows

要正确解决此问题,请使用以下方法:

  1. 像以前一样从Windows添加和推送文件
  2. 在Unix服务器上创建一个cron作业,检查权限并发送错误的电子邮件。
  3. 当电子邮件进来时,连接到Unix服务器并修复权限
  4. 从Unix提交并推送更改。
  5. 如果在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

我们还没有尝试,但我会在做完之后再回复。