Git:远程拒绝,无法将对象迁移到永久存储

Con*_*nor 2 git

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v origin 
feature/xxx:feature/xxx
POST git-receive-pack (3470 bytes)
Pushing to http://xxx@stash/xxx.git
To http://stash/xxx.git
! [remote rejected] feature/xxx -> feature/xxx (unable to migrate objects 
to permanent storage)
error: failed to push some refs to 
'http://xxx@stash/xxx.git'


Completed with errors, see above.
Run Code Online (Sandbox Code Playgroud)

有人可以解释如何解决此错误吗?我已经查看了其他一些类似的问题,但我找不到任何有助于解决此推送被拒绝的原因-我实际上在半小时前更新了分支,并想推送一个我忘记包含的新文件在最初的推动中。我尝试更新 dev 然后切换回我正在处理的功能分支,因为一些评论表明 git 尝试更新其他本地分支和远程分支之间的差异,但这没有做任何事情 - 我得到完全相同的错误消息和以前一样。

tor*_*rek 5

unable to migrate objects to permanent storage通常是服务器上配置错误的结果。在任何情况下,很可能您最后所做的任何事情都不会改善结果。

当服务器收到 . 时git push,接收方 Git 从发送方获取一系列 Git 对象——提交、树、blob 和/或标签,所有这些构成了从执行git push. 然后发送者发送一个请求:*我希望你,接收者,用一些特定的分支和/或标签名称来命名这些对象,以便它们变得可访问。*

在 2.11.0 之前的 Git 版本中,对象会立即进入接收者的对象数据库。然后接收者将检查建议的名称创建或更新(例如,feature/xxx应该指向 object 1234567...),验证它是否正常,然后执行更新并回复OK、完成或拒绝更新并显示特定错误,例如“不快”向前”。

在 Git 版本 2.11.0 中,过程发生了变化:传入的对象被放置在“隔离区”中,直到名称更新被接受。一旦接收方验证更新feature/xxx正常,接收方必须对象从隔离区移动到对象数据库中。一旦移动成功并且更新完成,您就会从服务器获得OK, done回复。

正是这种从存储库中的隔离区到存储库对象数据库的移动失败了。换句话说,您的推送请求没有任何问题。相反,服务器说:我会按照你的要求去做,但我摔倒了,无法修复自己。

要解决这个问题,控制服务器的人应该登录到机器并检查存储库区域,特别注意文件和目录的所有权和权限、磁盘配额以及可能影响此对象迁移过程的任何其他内容。

  • 谢谢——这是对其工作原理的很好的概述。正如您所建议的,这确实是一个权限问题。存储库所在的虚拟机显然是以 root 身份启动的,因此在我推送之前必须重置存储库权限。再次感谢您对正在发生的事情的描述。 (2认同)