Smudge Error: Smudge Filter LFS Failed during Git Pull

Smudge Error: Smudge Filter LFS Failed during Git Pull

我是游戏开发团队的一员。我们正在开发一个 Unreal Engine 4 game for PC. We have a private GitLab 服务器处理项目的版本控制。

现在,当任何人试图 Git 从我们 Git 项目的特定分支中拉取数据时,他们会收到 Smudge Error:

Downloading UE4Proj/Content/Game/Art/Architecture/MedievalVillage/Textures/Bucket_A.uasset (1.3 MB)
Error downloading object: UE4Proj/Content/Game/Art/Architecture/MedievalVillage/Textures/Bucket_A.uasset (c366451): Smudge error: Error downloading Ue4Proj/Content/Game/Art/Architecture/MedievalVillage/Textures/Bucket_A.uasset (c366451e360519497bf1719bacdc40c938c833adf9b8060d90d0829fec15d6c8): expected OID c366451e360519497bf1719bacdc40c938c833adf9b8060d90d0829fec15d6c8, got e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 after 0 bytes written

error: external filter 'git-lfs filter-process' failed
fatal: UE4Proj/Content/Game/Art/Architecture/MedievalVillage/Textures/Bucket_A.uasset: smudge filter lfs failed

我们让创建此分支的开发人员删除 Bucket_A.uasset 并重新推送更改。当任何人尝试 Git 立即拉取时,他们会收到一个带有不同文件的 涂抹错误

Downloading UE4Proj/Content/Game/Art/Architecture/MedievalVillage/Textures/Bucket_C.uasset (1.4 MB)
Error downloading object: UE4Proj/Content/Game/Art/Architecture/MedievalVillage/Textures/Bucket_C.uasset (4023793): Smudge error: Error downloading UE4Proj/Content/Game/Art/Architecture/MedievalVillage/Textures/Bucket_C.uasset (40237933795d4ca4b4c58e2884e219c3e4cd8168af176f01b33d71e3353376d7): expected OID 40237933795d4ca4b4c58e2884e219c3e4cd8168af176f01b33d71e3353376d7, got e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 after 0 bytes written

error: external filter 'git-lfs filter-process' failed
fatal: UE4Proj/Content/Game/Art/Architecture/MedievalVillage/Textures/Bucket_C.uasset: smudge filter lfs failed

所以这不是一些孤立的事件:看起来多个文件可能存在 涂抹错误。真正令人恼火的部分是 Smudge Error only 出现在 Git Pull 的 99% 左右,因此通过 Smudge 删除文件在尝试 Git 拉动一两个小时后手动错误 (无论它是什么),然后重新推送更改,这被证明是一项繁重的工作,并且肯定会导致 Unreal Engine 项目本身(因为纹理现在将丢失)。

Unreal Engine 报告这些 UASSET 文件中的任何一个都没有问题,这告诉我这些文件的内容没有任何问题。

为了 Git 拉取项目,我们有团队成员使用 SourceTree 和 Windows 命令行。他们都收到同样的错误。

什么是 Smudge 错误,是否有任何处理这些问题的建议,以便我们可以成功获取此 Git 分支?这是一个需要由个人 Puller 解决的问题,Pusher and/or Git Server Host?

GitLFS使用smudge and clean filter将版本库中的指针文件变成你签入的大文件,smudge过程就是这个过程。

您看到的消息是因为 Git LFS 正在尝试从服务器下载对象,但它的散列不正确。 Git LFS 使用 SHA-256 来识别文件,它接收的文件是空文件(其中 e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 是散列),而不是您想要的文件。这是你服务器的问题; Git 或 Git LFS 不是问题。

如果您尝试再次上传该对象,GitLab 可能会认为它已经拥有该对象而不会请求上传它。您将需要告诉 GitLab 删除现有对象,但已完成,然后从拥有该对象的客户端再次推送该对象。

如果您发现大量文件存在此问题,则您的 GitLab 实例可能存在严重问题。截断的零长度文件是机器崩溃时的常见问题,您应该检查 GitLab 实例是否存在任何问题。如果您不确定如何操作,您应该联系 GitLab 寻求支持。

所以我解决了这个问题:我们最终将我们的 GitLab VM 回滚到之前到 Git 推送的时间 Git GitLab VM 锁定(在 Git 分支被推送之前尝试了几次)。回滚 GitLab VM 后,我向 VM 添加了更多 RAM 和 CPU:再次推送 Git 分支,这次 GitLab VM 没有锁定.推送成功后,就可以无误地拉取分支了!因此,在拉动分支(或 Git 项目中的任何其他分支时,我们不再收到 Smudge Errors,我将进一步解释)。

我们认为,自从 GitLab VM 在 Git 推送期间锁定事件以来,项目 Git 存储库已损坏。事实上,anyone 从我们项目分支的 any 中提取(由于某种原因减去 master)正在接收 Smudge Errors,包括以前可以无错误拉取的分支!我非常感谢在我们的Git服务器上执行定期快照和备份。

对托管 Git 服务器的任何人的警告:如果要尝试进行大推送,请先快照并备份 Git 服务器。相信我,您真的不想要损坏的 Git 存储库!