![Besseres String-Escapen für hg](https://rvso.com/image/31684/Besseres%20String-Escapen%20f%C3%BCr%20hg.png)
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.pdf
fü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 .hgignore
Datei Muster hinzugefügt habe).
hg addremove -h
sagt 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 stderr
und 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 --quiet
Option nicht zu reagieren.
Antwort2
Wenn es in seiner Eingabe xargs
sieht , 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.pdf
xargs
Unter Linux, *BSD und OSX xargs
wird die Option unterstützt -0
, die anweist, auf Datensätze zu reagieren, die durch Nullbytes ohne Anführungszeichen getrennt sind. hg status -0
erzeugt 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