Git 推送到远程失败:无法创建./refs/heads/master.lock:参数无效



我在远程服务器文件夹/home/bare/mygit.git 中初始化了我的 git 裸存储库

我已经克隆了这个存储库:

git clone user@ip.of.my.server:/home/bare/mygit.git .

然后我正在处理项目,进行提交/推送等......

但是今天我在推送时注意到此错误:

user@host:/var/www/mygit (master)$ git push origin master
user@ip.of.my.server's password: 
Counting objects: 5, done.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 297 bytes, done.
Total 3 (delta 2), reused 0 (delta 0)
fatal: Unable to create '/home/bare/mygit.git/refs/heads/master.lock': Invalid argument
fatal: The remote end hung up unexpectedly
fatal: recursion detected in die handler

我搜索了这个问题,但似乎大多数人对权限有问题。但在这种情况下,错误看起来不同(例如权限被拒绝或其他内容)。

权限没问题,克隆/拉取/获取没问题。日志中没有错误或类似的东西。

这不是与 git 相关的问题。最终我无法创建一些新文件。

当我运行 dmesg 时,我看到内核中有很多错误。我决定先重新启动服务器,然后再深入挖掘,但是重新启动服务器后问题已经消失。

感谢大家的帮助!

请注意

,在 Git 2.14.x/2.15(2017 年第 3 季度)中,该错误消息将不那么频繁。

参见 commit 4ff0f01 (21 Aug 2017) by Michael Haggerty ( mhagger )。
(由Junio C Hamano -- gitster -- 在提交f2dd90f中合并,2017年8月27日)

用于获取引用锁的代码(例如,在接受来自客户端的推送时)用于在引用已锁定时立即失败。

现在,它会等待很短的时间并重试,如果锁持有人在只读操作期间持有它,则可以使其成功。

更准确地说:

refs:重试获取参考锁 100ms

引用锁定的哲学是,"如果另一个过程是 更改引用,那么无论我尝试对它做什么,都会 无论如何都可能失败,因为我的旧 SHA-1 值可能不再 当前"。

但是如果另一个进程已锁定,则此论点会失败 对执行实际上不会更改值的操作的引用 的引用,例如pack-refsreflog expire
实际上,计划中的参考更新很有可能 在其他进程发布后仍然能够通过 锁。

因此,当尝试锁定单个引用时(例如,在创建时 " refs/heads/master.lock "),如果它已被锁定,则重试 锁定采集大约 100 毫秒,然后放弃。这 应该消除一些不必要的锁冲突而不会浪费很多 的时间。

添加配置设置core.filesRefLockTimeout 以允许此操作 要调整的设置。

最新更新