따라서 버전 관리 시스템 hg에 나열된 누락된 파일을 정기적으로 삭제합니다. 내가 알아차린 것은 내 스크립트가 문자열을 적절하게 이스케이프하지 않았다는 것입니다.
hg status | grep ! | colrm 1 2 | sed 's/ /\\ /g' | xargs hg remove
많은 경우에 작동하지만 일부 이상한 문자열로 recognition-systems2013/20110531-information-fusion.key/\!\(\*-4.pdf
인해 작동이 중단될 수 있습니다. 그런데, hg는 이 문자열이 "Windows 안전"이 아니라고 말합니다... 그게 무슨 뜻이든 간에 말이죠.
누구든지 "!"로 나열된 파일을 삭제하는 더 좋은 방법을 찾을 수 있습니까? 아니면 실종됐나요?
답변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