![Mejor escape de cuerda para hg](https://rvso.com/image/31684/Mejor%20escape%20de%20cuerda%20para%20hg.png)
Por eso, periódicamente elimino los archivos que el sistema de control de versiones hg indica que faltan. Lo que he notado es que este script (ciertamente feo) que tengo no escapa correctamente a las cadenas:
hg status | grep ! | colrm 1 2 | sed 's/ /\\ /g' | xargs hg remove
Funciona en muchos casos, pero algunas cuerdas extrañas recognition-systems2013/20110531-information-fusion.key/\!\(\*-4.pdf
hacen que se rompa. Por cierto, hg me dice que estas cadenas no son "seguras para Windows"... sea lo que sea que eso signifique.
¿Alguien puede encontrar una mejor manera de eliminar los archivos hg que aparecen como "!" o desaparecido?
Respuesta1
Yo suelo:
hg addremove
para esodespués de que eliminé cualquier elemento no deseado del directorio retirado(o después de agregar patrones al .hgignore
archivo).
hg addremove -h
Te dijo:
Add all new files and remove all missing files from the repository.
Mercurial se queja del *
nombre del archivo. Es un carácter reservado que no se puede utilizar en nombres de archivos en Windows. Sin embargo, ese mensaje en sí llega stderr
y no debería afectar el funcionamiento de las tuberías.
Una alternativa es utilizar:
hg remove --after
que marca los archivos que se eliminan pero comenta todos los archivos (los que todavía están allí y los eliminados) y no parece reaccionar a la --quiet
opción.
Respuesta2
Cuando xargs
ve \!\(\*-4.pdf
en su entrada, entiende !(*-4.pdf
. Si usa xargs
, necesita producir una entrada que coincida con su sintaxis de entrada, que no se parece a nada que exista. Simplemente agregar una barra invertida antes de los espacios solo soluciona los espacios.
En Linux, *BSD y OSX, xargs
admite la opción -0
, que le indica que actúe sobre registros separados por bytes nulos sin comillas. hg status -0
produce registros que están separados por bytes nulos. Lo que queda es adaptar el procesamiento intermedio para hacer frente a nulos en lugar de nuevas líneas como separadores.
Con GNU awk o cualquier otro awk que admita bytes nulos como separadores de registros (creo que BSD/OSX awk sí), puede cambiar su transformación a awk.
hg status -0 |
awk -v RS='\0' -v ORS='\0' '/^!/ {print substr($0, 3)}' |
xargs -0 hg remove