【问题标题】:git push... fatal: Unable to create master.lock: File existsgit push ...致命:无法创建master.lock:文件存在
【发布时间】:2016-09-02 16:46:26
【问题描述】:

帮助!当我现在尝试做git push origin master 时,我得到:

fatal: Unable to create '/home/ubuntu/workspace/.git/refs/remotes/origin/master.lock': File exists.
If no other git process is currently running, this probably means a
git process crashed in this repository earlier. Make sure no other git
process is running and remove the file manually to continue.

当然,我发现了其他类似的问题(例如here),但那里的投票答案只是建议删除有问题的文件......但该文件不存在!

我最近尝试使用以下方法清除一些空间后,我担心会发生这种情况:

$ sudo git reflog expire --all --expire=now
$ sudo git gc --prune=now --aggressive

这可能是原因吗?有什么修复建议吗?

【问题讨论】:

  • 如果文件确实不存在,则错误处理中发生了一些奇怪的事情,因为错误消息应该是No such file or directory(即ENOENT,而不是EEXIST)。但是,使用sudo 后最可能出现的问题是,您的存储库的一部分归您所有,一部分归超级用户所有,并且由于您不是超级用户,因此您不再有权触摸你的存储库。当然在这种情况下错误应该是EPERMPermission denied...!
  • @torek,天哪!有什么解决办法吗?
  • 嗯,首先,问题是这是否真的是问题所在。您可以使用ls -lR(递归ls -l)来查看所有权是否混淆。如果是这样,既然你显然有 sudo,你可以sudo chown -R <yourself> . 将所有所有权归还给你自己。
  • @torek 我应该在 .git 文件夹中的哪个位置执行此操作?
  • 鉴于您运行的两个命令应该只触及.git 中的东西,是的(如果是我,我会运行find . -user rootfind . ! -user <me> 作为ls 的快捷方式,只是想看看我是否在其他地方做了同样愚蠢的事情,为了舒适,把find 做得尽可能高……)。

标签: git repository


【解决方案1】:

问题似乎源于以超级用户 (sudo ...) 身份运行过期代码。当 Git 调整远程跟踪分支文件时,它们就归超级用户所有(因此只能由超级用户调整)。

解决方法是将这些文件放回正确的所有者(在本例中为 ubuntu)。可以使用一揽子所有权更改,例如sudo chown -R ubuntu .git,或选择性更改(仅更改错误拥有的文件),例如,以root 身份(或再次使用sudo,这个更烦人,因为管道)find .git -user root -print0 | xargs -0 chown ubuntu。它们之间的唯一区别(如果有的话)是chown -R 可能会更新更多文件的ctime(inode 更改时间)字段(通过在已经正确拥有的文件上实际运行chown 系统调用),这反过来可以影响备份系统。

更一般的规则是“不要随意在内容前加上 sudo”——在这种情况下,没有理由将 sudo 放在 git reflog expiregit gc 命令的前面。

【讨论】:

    猜你喜欢
    • 2019-02-18
    • 2013-05-12
    • 2012-01-19
    • 2012-12-09
    • 2011-12-13
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多