Вы упомянули *.rb inside gitattributes
. Кажется, что вопрос использует clean filter
. Предположим, файл xml имеет значение foo.xml
.
Создать .gitattributes
и указать фильтр для foo.xml
:
echo 'foo.xml filter=removeignore' >> .gitattributes
git add gitattributes
git commit
Вы можете назвать removeignore
как угодно. И затем укажите чистый фильтр для removeignore
:
git config filter.removeignore.clean 'sed -n -e "/<!--/, /<!--/!p"'
Команда sed
печатает строки, которые не находятся между строками, начинающимися с <!--
. Добавить и зафиксировать foo.xml
.
git add foo.xml
git commit
Здесь немного запутанно. Теперь чистый фильтр должен был работать, но если вы откроете foo.xml
, вы увидите, что ожидаемые для удаления строки все еще там. На самом деле, чистый фильтр работает. git show HEAD:foo.xml
печатает очищенную версию, что означает, что подтвержденная версия исключает строки между <!--
. Еще одно доказательство - клонировать текущий репозиторий в другой локальный репозиторий, и вы обнаружите, что новый репозиторий имеет очищенную версию foo.xml
с git clone path/to/current/repository -b <branch> -- path/to/another/folder
. Ожидаемые для удаления строки хранятся в текущем репозитории, чтобы они могли работать как комментарии. Новые правки между <!--
не будут зафиксированы. Если вы хотите удалить их из текущего репозитория, используйте rm foo.xml && git reset --hard
. Обратите внимание, что git reset --hard
отменяет все незафиксированные изменения. Если у вас есть другие незафиксированные изменения, ставьте sh или передайте их в первую очередь.
Чистый фильтр здесь работает только для примера в вашем вопросе. Если ваш реальный случай более сложный, лучше написать сценарий, который принимает путь к файлу для параметра, и заменить команду sed
сценарием. Сценарий, который я могу придумать, - это сценарий python, который использует xml.dom.minidom
для точного анализа foo.xml
, удаляет нежелательные строки и выводит ожидаемые строки. Не забудьте сделать скрипт исполняемым и добавить его путь в переменную окружения PATH
.