
Поэтому периодически я удаляю файлы, которые система контроля версий 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