Использование черного с чистым фильтром git

1

Я пытаюсь настроить черный для запуска в любых файлах, проверенных на git.

Я установил его следующим образом:

git config filter.black.clean 'black -'
echo '*.py filter=black' >> .git/info/attributes

Насколько я понимаю, это должно работать нормально, как черное с - поскольку исходный путь будет считываться с STDIN и выводиться на STDOUT, что, по-моему, требует фильтра git.

Однако это не сработает. Когда я добавляю нечерный файл с git add я вижу следующий вывод:

reformatted -
All done!   
1 file reformatted.

И файл не изменяется на диске. Что я делаю неправильно?

Теги:

1 ответ

2
Лучший ответ

В документации Black рекомендуется использовать привязку для предварительной фиксации, а не размывание и очистку фильтров. Обратите внимание, что filter.black.clean определяет чистый фильтр, и вы не настроили никаких фильтров smudge.

Причина, по которой вы не видите изменения в дереве рабочей версии файла, заключается в том, что при преобразовании рабочей папки файла в индексную (файл) версию файла используется чистый фильтр. Это не влияет на рабочую версию файла!

Фильтр smudge используется в противоположном направлении: у Git есть файл, который находится в индексе, по какой-либо причине, например, потому что он просто скопирован в индекс как часть операции git checkout чтобы переключиться на конкретную фиксацию и желания конвертировать этот встроенный в сжатый, Git-ized файл в тот, который вы можете увидеть и отредактировать в своем редакторе, или запустить с помощью python. Git в это время запустит (скомпенсированное) содержимое файла через ваш фильтр smudge.

Обратите внимание, что если вы конвертируете содержимое файла, предварительное сжатие, в чистый фильтр, а затем извлекаете этот файл из репозитория, в индекс и включаете в свое рабочее дерево, вы в это время сможете увидеть, что произошло в чистом фильтре (при условии, что у вас нет компенсирующего фильтра смазки, который отменяет эффект).

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

Это не то, как черным на самом деле предназначено для использования, хотя, вероятно, его можно использовать именно так.

  • 0
    Спасибо, что было очень полезно. Моя проблема с ловушкой перед фиксацией состоит в том, что я в конечном итоге получил зафиксированные неочищенные файлы и еще один набор локальных изменений затемненных файлов, поэтому один коммит по сути стал бы двумя, если файлы изначально не были черными. Может быть, я настроил это неправильно, хотя ...
  • 1
    Еще одна подсказка для отладки: Git также выполнит определенные оптимизации, когда сможет, когда считает, что файлы уже достаточно чистые или загрязненные, поэтому возможно, что некоторые случаи не проходят через фильтр. Установка ненулевого значения переменной среды GIT_TRACE позволяет наблюдать за некоторыми внутренними действиями, включая запуск фильтров.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню