我在我的工作站上使用Ubuntu,每当我尝试提交/推送到位于我的LAN中的CIFS共享上的Mercurial存储库时,我都会抛出此错误:abort: Operation not permitted: /media/repos/myRepo/.hg/journal.dirstate
但是,在使用sudo
之前添加任何导致此命令的命令时,会让mercurial继续运行而不会给我带来任何错误。
我该怎么做才能停止每次提交sudo
?
答案 0 :(得分:3)
您的用户没有/media/repos/myRepo
的写入权限。您可以使用ls -la
检查所有者和权限。根据结果,您应该:
尝试使用chmod
更改权限,以允许您的用户或群组访问。
sudo chmod -R ug+w /media/repos/myRepo
(ug+w
表示为群组和所有者用户添加写入权限,如果您与所有者位于同一群组中,这将有效。否则,您可以尝试只添加+w
它适用于所有用户,但不太安全。)
尝试将chown
的所有者更改为您的用户或群组。
sudo chown -R <myuser>:<mygroup> /media/repos/myRepo
(myuser
和mygroup
都是可选的)
还要确保在整个存储库中递归使用chown
和chmod
。如果每次都重新创建journal.dirstate
(我认为会发生什么),它会从.hg
目录继承其权限,因此您在文件本身上更改的任何权限都可能会丢失。
答案 1 :(得分:1)
问题可能与2.1.2之前的Mercurial版本中与失败事务相关的bug有关。
如果hg push
在操作中途失败,问题就会突然出现。例如,由于网络中断或服务器端的挂钩中止事务,可能会发生这种情况。这可能导致陈旧文件journal.dirstate
留在服务器端.hg
目录中。
从此时起,journal.dirstate
或root用户以外的任何用户都无法推送,无论journal.dirstate
上的文件权限如何。这是因为在推送过程中,Mercurial会尝试将chmod
文件发送给执行推送的用户,并提供您观察到的错误:Operation not permitted
。
要解决此问题,您可以尝试以下任一方法:
让文件journal.dirstate
的所有者成功推送。应该在过程中清理过时的文件;或
将Mercurial的服务器版本更新为2.1.2或更高版本;或
删除服务器端的文件journal.dirstate
。
执行上述任何一项后,所有用户都应该再次推送。