Удаление определенных XML строк из постановки в git - PullRequest
0 голосов
/ 18 января 2020

Я попытался ответить на другой вопрос SO, который использовал * .rb внутри gitattributes. Похоже, это не сработало (либо я неправильно выполняю свое регулярное выражение, либо sed не следует моему регулярному выражению ...), но есть ли у кого-нибудь полное решение этого вопроса?

Скажите, что у меня было следующие строки:

<note>
<!-- gitignore -->
<to>Tove</to>
<from>Jani</from>
<!-- gitignore -->
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>

Я хочу избавиться от двух комментариев и всего, что между ними, чтобы они не ставились. Как бы я это сделал?

Ответы [ 2 ]

0 голосов
/ 20 января 2020

Вы упомянули *.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.

0 голосов
/ 18 января 2020

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

Однако, если вы действительно хотите это сделать, вы можете использовать грязный / чистый фильтр. Ваша команда smudge будет cat, а ваш чистый фильтр будет sed -e '/gitignore/,/gitignore/d'. Если вы хотите более строгое соответствие, вы можете настроить регулярные выражения по своему вкусу.

Чтобы узнать, как настроить грязный / чистый фильтр, см. Справочную страницу gitattributes(5).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...