Mejor escape de cuerda para hg

Mejor escape de cuerda para hg

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.pdfhacen 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 .hgignorearchivo).
hg addremove -hTe 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 stderry 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 --quietopción.

Respuesta2

Cuando xargsve \!\(\*-4.pdfen 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, xargsadmite la opción -0, que le indica que actúe sobre registros separados por bytes nulos sin comillas. hg status -0produce 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

información relacionada