2012-01-05 953 views
3

我使用Ubuntu我的工作站上,每当我尝试提交/推到位于在我的LAN CIFS共享一个Mercurial库,我得到这个错误抛出:abort: Operation not permitted: /media/repos/myRepo/.hg/journal.dirstate 必须是根推/提交含汞库

但是,在sudo前面加上任何引起这个问题的命令,都会让mercurial继续下去,而不会向我抛出任何错误。

我应该怎么做才能停止sudo每次提交?

+1

修复您的存储库的权限(可能既是主人又是您的本地人)。 – robert 2012-01-05 13:42:25

+0

做到了。 Chmod:ed已经达到777并且没有变化。 – Industrial 2012-01-05 13:45:30

+2

如果您在'.hg'目录中显示'ls -la'的结果,这也有助于诊断问题。 – 2012-01-05 13:49:17

回答

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 

(无论myusermygroup可选)

而且一定要使用chownchmod递归地对整个存储库。如果每次都重新创建journal.dirstate(我认为会发生这种情况),它将从.hg目录继承它的权限,因此您在文件本身上更改的任何权限可能会丢失。

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

执行任何这些操作后,所有用户都应该能够再次推送。