![Лучшее экранирование строк для hg](https://rvso.com/image/31684/%D0%9B%D1%83%D1%87%D1%88%D0%B5%D0%B5%20%D1%8D%D0%BA%D1%80%D0%B0%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%20%D0%B4%D0%BB%D1%8F%20hg.png)
Поэтому периодически я удаляю файлы, которые система контроля версий hg считает отсутствующими. Я заметил, что этот (признаюсь, уродливый) скрипт, который у меня есть, не экранирует строки должным образом:
hg status | grep ! | colrm 1 2 | sed 's/ /\\ /g' | xargs hg remove
Это работает во многих случаях, но некоторые странные строки, такие как , recognition-systems2013/20110531-information-fusion.key/\!\(\*-4.pdf
заставляют его ломаться. Кстати, hg говорит мне, что эти строки не являются "безопасными для Windows"... что бы это ни значило.
Может ли кто-нибудь придумать лучший способ удалить файлы, которые hg перечисляет как "!" или отсутствующие?
решение1
Я использую:
hg addremove
для этогопосле того, как я удалил весь хлам из извлеченного каталога(или после того, как я добавил шаблоны в .hgignore
файл).
hg addremove -h
сообщает вам:
Add all new files and remove all missing files from the repository.
Mercurial жалуется на *
в имени файла. Это зарезервированный символ, который нельзя использовать в именах файлов в Windows. Однако само это сообщение идет stderr
и не должно влиять на функционирование каналов.
Альтернативой является использование:
hg remove --after
который отмечает файлы, которые удаляются, но комментирует все файлы (как те, которые все еще там, так и те, которые удалены) и, похоже, не реагирует на опцию --quiet
.
решение2
Когда xargs
видит \!\(\*-4.pdf
в своем вводе, он понимает !(*-4.pdf
. Если вы используете xargs
, вам нужно создать ввод, который соответствует его синтаксису ввода, что не похоже ни на что другое. Простое добавление обратной косой черты перед пробелами справляется только с пробелами.
В Linux, *BSD и OSX xargs
поддерживает опцию -0
, которая сообщает ему, что нужно действовать с записями, разделенными нулевыми байтами без кавычек. hg status -0
создает записи, разделенные нулевыми байтами. Остается только адаптировать промежуточную обработку для работы с нулями вместо новых строк в качестве разделителей.
С помощью GNU awk или любого другого awk, который поддерживает нулевые байты в качестве разделителей записей (я думаю, что BSD/OSX awk поддерживает), вы можете переключить свое преобразование на awk.
hg status -0 |
awk -v RS='\0' -v ORS='\0' '/^!/ {print substr($0, 3)}' |
xargs -0 hg remove