no-broken-repo-paths: ложное срабатывание на .git/ (служебные каталоги — не файлы репозитория) #9
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Симптом
volody/dispatcherMR !145, pipeline #3343, джобаpre-commit:.git/config.lock— не ссылка на файл репозитория, а рантайм-lock, который git создаёт и удаляет по ходу операции. Комментарий описывает поведение git, а не путь в дереве. Правка кода тут ничего не улучшит: любой корректный способ упомянуть.git/config.lockв комментарии будет красным.Причина
Эвристика хука: токен содержит
/, оканчивается файловым расширением, и его первый сегмент — реально существующий каталог репо (резолв от cwd)..gitсуществует всегда,.lockпарсится как расширение — условие выполняется, файла нет → FAIL.Тот же класс ложных срабатываний дадут
.venv/,node_modules/,.cache/— всё, что лежит рядом с деревом, но в него не входит.Что сделать
Игнорировать пути, чей первый сегмент — служебный каталог, а не часть дерева. Минимально —
.git/; заодно стоит закрыть.venv/,node_modules/,.cache/,.pytest_cache/,dist/,build/.Точнее и надёжнее — сверяться не с файловой системой, а с индексом git (
git ls-files): в дереве репозитория.git/отсутствует по определению, и заодно перестанут ловиться артефакты сборки, которые лежат на диске, но не отслеживаются. Это же уберёт зависимость результата от того, что именно валяется в рабочем каталоге в момент прогона.Приёмка
.git/config.lockпроходит хукdocs/nope.md) по-прежнему падаетdist/bundle.js) не падаетБлокирует
volody/dispatcher#180— MR !145 не может позеленеть, пока хук ловит эту строку. Обходной путь на стороне потребителя (excludeнаdispatcher/runner.py) выключил бы проверку всего файла, поэтому лучше починить здесь.Смежная задача по этому же репозиторию — #8 (
no-issue-refs-in-commentsдля//-комментариев, строгийTODO(#N)); обе просятся в один тег.✅ Вышло в
v0.11.0(PR #10, коммит3530435)..git/отсечён жёстко — он есть в любом репозитории и содержимым не является. Для остального спрашиваем сам git черезcheck-ignore: путь под.gitignore— артефакт (node_modules/,dist/,.venv/), и его отсутствие нарушением не считается. Своего списка имён не держим: у каждого потребителя он свой и уже описан в его.gitignore.Вопрос задаётся строго от корня репозитория — иначе при запуске из подкаталога
.gitignoreподкаталога подменял бы вердикт, и настоящая висячая ссылка тихо пропадала. Это поймало ревью, кейс на подкаталог добавлен.Проверено, что отсечка не глушит хук целиком: файл со служебными путями и настоящей висячей ссылкой по-прежнему падает.
Разблокирует
volody/dispatcher!145, который падал на комментарии с.git/config.lock.