Ошибка размытия: сбой LFS фильтра размытия во время извлечения Git

#git #atlassian-sourcetree #unreal-engine4 #pull #git-lfs

#git #atlassian-sourcetree #unreal-engineer4 #тянуть #git-lfs

Вопрос:

Я являюсь частью команды разработчиков игр. Мы разрабатываем игру Unreal Engine 4 для ПК. У нас есть частный сервер GitLab, обрабатывающий управление версиями проекта.

Прямо сейчас, когда кто-либо пытается выполнить Git Pull из определенной ветви нашего проекта Git, он получает ошибку Smudge:

 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 Pull сейчас, он получает ошибку размытия с другим файлом:

 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
 

Так что это не какой-то изолированный инцидент: похоже, что для нескольких файлов могут быть ошибки размытия. Действительно усугубляющая часть заключается в том, что ошибка размытия отображается только примерно на 99% от Git Pull, поэтому просмотр и удаление файла с ошибкой размытия (какой бы она ни была) вручную после часа или двух попыток Git Pull, а затем повторной очистки изменений, оказывается огромнымрутинная работа и, безусловно, вызовет проблемы с самим проектом Unreal Engine (поскольку текстуры теперь будут отсутствовать).

Unreal Engine сообщает об отсутствии проблем ни для одного из этих файлов UASSET, что говорит мне, что с содержимым этих файлов все в порядке.

Для Git-извлечения проекта у нас есть член команды, использующий SourceTree и командную строку Windows. Все они получают эту же ошибку.

Что такое ошибка размытия и есть ли какие-либо рекомендации по их устранению, чтобы мы могли успешно выполнить эту ветку Git? Это проблема, которая должна быть решена отдельными съемниками, толкателем и / или хостом сервера Git?

Ответ №1:

Итак, я решил проблему: в итоге мы откатили нашу виртуальную машину GitLab на время, предшествующее Git Push, из-за которого виртуальная машина GitLab заблокировалась (потребовалось несколько попыток, прежде чем в то время была запущена ветка Git). После отката виртуальной машины GitLab я добавил больше оперативной памяти и процессора к виртуальной машине: ветка Git была снова запущена, и на этот раз без блокировки виртуальной машины GitLab. После успешного нажатия ветвь может быть извлечена без ошибок! Таким образом, мы больше не получаем Smudge Error s при извлечении ветки (или любой другой ветки в проекте Git, если на то пошло, как я объясню далее).

Мы считаем, что с тех пор, как произошло событие блокировки виртуальной машины GitLab во время Git Push, репозиторий Project Git был поврежден. Действительно, любой, кто извлекал из любой из наших ветвей проекта (по какой-то причине за исключением master), получал Smudge Error s, в том числе из предыдущих ветвей, которые раньше можно было извлекать без ошибок! Я очень благодарен, что на нашем сервере Git выполняются регулярные снимки и резервные копии.

Предупреждение всем, у кого есть Git-сервер: если будет предпринята большая попытка, сначала сделайте снимок и сделайте резервную копию Git-сервера. Поверьте мне, вам ДЕЙСТВИТЕЛЬНО не нужен поврежденный репозиторий Git!

Ответ №2:

Git LFS использует фильтр размытия и очистки, чтобы превратить файлы указателей в репозитории в большие файлы, которые вы вернули. Процесс размытия — это этот процесс.

Сообщение, которое вы видите, связано с тем, что Git LFS пытается загрузить объект с сервера, и его хэш неверен. Git LFS использует SHA-256 для идентификации файлов, и файл, который он получает, является пустым файлом (который e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 является хэшем), а не файлом, который вы предполагали. Это проблема на вашем сервере; это не проблема с Git или Git LFS.

Если вы попытаетесь загрузить объект снова, GitLab, вероятно, подумает, что у него уже есть объект, и не будет запрашивать его загрузку. Вам нужно будет указать GitLab удалить существующий объект, как бы это ни было сделано, а затем снова отправить объект от клиента, у которого он есть.

Если вы видите большое количество файлов с этой проблемой, у вашего экземпляра GitLab может возникнуть серьезная проблема. Усеченные файлы нулевой длины являются распространенной проблемой при сбое компьютера, и вам следует проверить свой экземпляр GitLab на наличие каких-либо проблем. Если вы не уверены, как это сделать, вам следует обратиться в GitLab за поддержкой.

Комментарии:

1. Вы уверены, что это проблема с нашим сервером, а не с Git Push, который был выполнен? Похоже, именно об этом сейчас думает наш Ведущий Программист. Есть ли способ удалить определенные файлы из ветки с помощью Git (GitLab не позволяет удалять файлы LFS в веб-графическом интерфейсе) и повторно загружать их? Или вся ветка нуждается в удалении, а вся ветка нуждается в повторной загрузке? Это большая ветка.

2. Ваш сервер должен проверять размер загружаемого объекта и не принимать объект, если он не соответствует размеру, даже если он не проверяет хэш, поэтому ваш сервер не работает, если он этого не делает. Протокол загрузки Git LFS предназначен для выполнения операции проверки, при которой сервер может проверить загруженный объект. Однако он не предоставляет способа удаления объектов. Я не могу говорить о том, что делает или не делает GitLab; Я не знаком с этим, поэтому вам придется спросить их.

3. Я полагаю, вы правы, что это действительно сервер или, возможно, весь репозиторий проекта: основная ветка в порядке, но когда кто-либо пытается извлечь данные из любой другой ветки, они получают «ошибки размытия». Я понятия не имею, что мне нужно сделать, чтобы исправить ситуацию. Есть ли у вас какие-либо рекомендуемые сообщества Git или Git LFS, к которым я мог бы обратиться? Я очень беспокоюсь, что мне нужно будет обратиться не только к сообществу GitLab.

4. Вы можете задать вопрос на доске обсуждений Git LFS на GitHub . Это не проблема, поэтому открывать ее как проблему было бы неправильно. Я скажу вам, что в проекте Git LFS не так много людей, знакомых с GitLab, поэтому я обязательно сначала спрошу GitLab.