Во-первых, примечание: git checkout
вообще не должен запускать чистый фильтр, поскольку он выполняет только индекс → копирование рабочего дерева. 1 При этом запускается фильтр smudge вместо. Чистый фильтр используется только в индексных операциях копирования рабочего дерева.
Поскольку git stash save
/ git stash push
выполняет операции индексного ← рабочего дерева, он будет использовать чистый фильтр.
Sta sh s apply
и pop
вызывают git merge-recursive
, что более сложно. В то время как в индексе происходит некоторое слияние, иногда для этого нужно выполнить удаление и / или очистку, 2 , поэтому здесь вы также увидите некоторые случаи вызова чистого фильтра.
Как ElpieKay предложил в комментарий, быстрый и грязный, но простой способ отключить фильтр, это временно переопределить конфигурацию его драйвера в командной строке с опцией -c
внешнего интерфейса: git -c filter.<em>name</em>.<em>type</em>=noop
для каждого применимого name
(имя драйвера в .gitattributes
) и type
(clean
или smudge
).
1 Это верно для git checkout
выполняет переключение ветви (операция git switch
в Git 2.23 или более поздней версии) или восстановление файла (операция git restore
в Git 2.23 или более поздней версии). В любом случае извлечение обновляет индексные копии некоторых файлов, если это необходимо, а затем обновляет копию рабочего дерева из каждой обновленной или выбранной индексной копии.
То есть при использовании git checkout -- <em>paths</em>
учитывая paths
обновляться в рабочем дереве из копий, уже присутствующих в индексе: для этого требуется смазать. При использовании git checkout <em>tree-ish</em> -- <em>paths</em>
данные paths
копируются из указанного tree-ish
в индекс, а затем копируются в рабочее дерево: для этого также требуется смазать.
Или, при использовании git checkout <em><code>commit
или git checkout branch
, записи индекса, которые отличаются от предыдущего HEAD
и вновь выбранного, обновляются в индексе, а затем копируются в работу. -дерево, которое требует размытия.
2 git merge -X renormalize
всегда запускает оба, сначала делает пятно, а затем очищает, перед объединением, для каждого файла в каждом коммите, используя .gitattributes
с рабочего дерева. Настройка merge.renormalize
в вашей конфигурации имеет тот же эффект, если вы не переопределите это с помощью git merge -X no-renormalize
. Хотя git merge-recursive
является более низким уровнем, чем git merge
, я ожидаю, что он делает довольно похожие вещи для двух коммитов, которые не представлены существующим содержимым рабочего дерева.