Besseres String-Escapen für hg

Besseres String-Escapen für hg

Daher entferne ich regelmäßig Dateien, die vom Versionskontrollsystem hg als fehlend aufgeführt werden. Was mir aufgefallen ist, ist, dass dieses (zugegebenermaßen hässliche) Skript, das ich habe, Zeichenfolgen nicht richtig maskiert:

hg status | grep ! | colrm 1 2 | sed 's/ /\\ /g' | xargs hg remove

In vielen Fällen funktioniert es, aber einige seltsame Zeichenfolgen wie diese recognition-systems2013/20110531-information-fusion.key/\!\(\*-4.pdfführen dazu, dass es nicht mehr funktioniert. Übrigens sagt mir hg, dass diese Zeichenfolgen nicht „Windows-sicher“ sind … was auch immer das heißen mag.

Kann sich jemand eine bessere Möglichkeit ausdenken, die Dateien zu entfernen, die hg als „!“ oder fehlend auflistet?

Antwort1

Ich benutze:

hg addremove

dafürnachdem ich jeglichen Müll aus dem ausgecheckten Verzeichnis entfernt habe(oder nachdem ich der .hgignoreDatei Muster hinzugefügt habe).
hg addremove -hsagt Ihnen:

Add all new files and remove all missing files from the repository.

Mercurial beschwert sich über das *im Dateinamen. Dabei handelt es sich um ein reserviertes Zeichen, das unter Windows nicht in Dateinamen verwendet werden kann. Diese Meldung selbst geht jedoch an stderrund sollte die Funktion der Pipes nicht beeinträchtigen.

Alternativ können Sie Folgendes verwenden:

hg remove --after

Das Programm markiert entfernte Dateien, kommentiert jedoch alle Dateien (sowohl die noch vorhandenen als auch die entfernten) und scheint auf die --quietOption nicht zu reagieren.

Antwort2

Wenn es in seiner Eingabe xargssieht , versteht es . Wenn Sie verwenden , müssen Sie eine Eingabe erstellen, die seiner Eingabesyntax entspricht, die anders ist als alles andere da draußen. Das bloße Hinzufügen eines Backslashs vor Leerzeichen bewältigt nur Leerzeichen.\!\(\*-4.pdf!(*-4.pdfxargs

Unter Linux, *BSD und OSX xargswird die Option unterstützt -0, die anweist, auf Datensätze zu reagieren, die durch Nullbytes ohne Anführungszeichen getrennt sind. hg status -0erzeugt Datensätze, die durch Nullbytes getrennt sind. Was bleibt, ist, die Zwischenverarbeitung so anzupassen, dass sie mit Nullen statt Zeilenumbrüchen als Trennzeichen umgehen kann.

Mit GNU awk oder einem anderen awk, das Nullbytes als Datensatztrennzeichen unterstützt (ich glaube, das BSD/OSX-awk tut das), können Sie Ihre Transformation auf awk umstellen.

hg status -0 |
awk -v RS='\0' -v ORS='\0' '/^!/ {print substr($0, 3)}' |
xargs -0 hg remove

verwandte Informationen