Skip to content

pre-commit: аудит git-lfs — не пропускать файлы, закоммиченные как raw blobs #44

Closed

Description

@vladcheck

Проблема

При коммите иконок (.png, .ico, .icns) файлы попали в историю как сырые бинарные блобы, хотя в .gitattributes для них уже был прописан filter=lfs. Причина: git add выполнился до применения правила, а git add --renormalize не запускался — Git считал индекс unchanged и не переобрабатывал файлы.

git check-attr в такой ситуации бесполезен: атрибут говорит lfs, а блоб в индексе — сырой. git lfs ls-files тоже не помогает: он отражает только закоммиченное состояние, а не то, что сейчас в staging.

В результате:

  • у контрибьюторов без git-lfs иконки приходят как текстовые указатели и не загружаются в рантайме;
  • jpackage собирает пакет со сломанными иконками;
  • размер .git растёт дублями бинарных данных.

Предлагаемое решение

Добавить в pre-commit job, который:

  1. проходит по staged-файлам (git diff --cached --diff-filter=ACMR);
  2. для каждого проверяет, что git check-attr filter = lfs;
  3. читает блоб из индекса через git cat-file -p :<path> и убеждается, что первые байты — заголовок LFS-указателя (version https://git-lfs.github.com/spec/v1);
  4. если хоть один файл не проходит — падает с перечислением виновников и подсказкой git add --renormalize ..

Не должен ничего исправлять — только аудит. Быстрый: на горстке файлов отрабатывает за доли секунды.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions