Просмотр git фильтрует вывод при использовании meld в качестве инструмента сравнения

Я установил несколько git filters, чтобы предварительно обработать определенные файлы (в моем случае IPython Notebooks) перед их выполнением. Чтобы быть более точным, я следую этим инструкциям: qaru.site/info/16893/...

Это прекрасно работает, и файлы будут правильно отфильтрованы, если я сделаю свои изменения или просмотрю изменения с помощью командной строки "git diff".

Однако, если я просматриваю свои изменения с помощью команды meld, файлы не фильтруются. Я попробовал несколько способов настроить meld как инструмент diff для git:

Но ни одно из решений, которые я нашел для использования meld в качестве инструмента diff, позволяет мне просматривать изменение файла после применения фильтров git.

У кого-нибудь есть идея о том, как достичь этого?

Ответ 1

Вот решение для этой проблемы. Исходный git фильтр, на который вы ссылаетесь, был формализован как пакет nbstripout (pip3 install nbstripout), но вы можете поместить любой фильтр в этот script, и он будет работать одинаково. Я предполагаю, что вы хотите настроить это для пользователя, а не для определенного репо.

В ~/.gitconfig добавьте новый драйвер diff с именем git-nb-clean-diff:

[diff "git-nb-clean-diff"]
    command = git-nb-clean-diff

В ~/.config/git/attributes сконфигурируйте переносные ноутбуки с этим драйвером diff:

*.ipynb diff=git-nb-clean-diff

Теперь нам нужно сделать фактический драйвер diff! В ~/bin/git-nb-clean-diff (должно быть указано это имя файла, но местоположение необязательно):

#!/bin/bash
# pass the stripped working tree file and the repo copy 
# to meld for diffing
meld <(cat $1 | nbstripout) $2

Наконец, мы делаем этот файл исполняемым

chmod +x ~/bin/git-nb-clean-diff

и добавьте его в путь, чтобы git мог найти наш драйвер diff при запуске

echo "PATH=$PATH:~/bin" >> ~/.bashrc
# reload the edited .bashrc
source ~/.bashrc