Alle verwerfen und eine saubere Kopie der neuesten Version erhalten?

159

Ich verschiebe einen Erstellungsprozess, um mercurial zu verwenden, und möchte das Arbeitsverzeichnis wieder in den Zustand der Spitzenrevision versetzen. Frühere Läufe des Erstellungsprozesses haben einige Dateien geändert und einige Dateien hinzugefügt, die ich nicht festschreiben möchte, sodass ich lokale Änderungen und Dateien habe, die nicht zum Repository hinzugefügt wurden.

Was ist der einfachste Weg, um all das zu verwerfen und ein sauberes Arbeitsverzeichnis mit der neuesten Version zu erhalten?

Derzeit mache ich das:

hg revert --all
<build command here to delete the contents of the working directory, except the .hg folder.>
hg pull
hg update -r MY_BRANCH

aber es scheint, dass es einen einfacheren Weg geben sollte.

Ich möchte das Äquivalent zum Löschen des Repos, zum Erstellen eines neuen Klons und zum Aktualisieren tun. Aber das Repo ist zu groß, um schnell genug zu sein.

Rory
quelle
1
Ist "(Inhalt löschen ...)" ein Kommentar zum Befehl "revert --all" oder ein Schritt, den Sie ausführen? Ich frage, weil "hg update" nur Dateien aktualisiert, die sich geändert haben. Wenn Sie vor dem Aktualisieren andere Dateien entfernen, erhalten Sie diese erst zurück, wenn Sie auf die Null-Revision ( hg update 00) und dann auf den Tipp zurück aktualisieren . Warum reicht es nicht hg revert --allaus, vor dem Abrufen und Aktualisieren wieder in einen konsistenten Arbeitsordnerstatus zurückzukehren?
Lasse V. Karlsen
Es ist ein separater Schritt, der mit meiner Build-Software ausgeführt wird. (Ich hätte einfach eine Befehlszeile löschen können, tat es aber nicht.)
Rory
1
Möglicherweise ist der archiveBefehl in Zukunft hilfreich. Zum Beispiel könnten Sie hg archive ../newbuild, und ein Schnappschuss Ihres Repositorys wird zuletzt hg updatedort platziert. Normalerweise mache ich das für nächtliche Builds, nur damit ich nicht riskiere, mein Repo zu überladen. Löschen Sie einfach das Build-Verzeichnis, wenn Sie es nicht mehr benötigen.
Tim Post

Antworten:

212

Diese Schritte sollten auf Folgendes verkürzt werden können:

hg pull
hg update -r MY_BRANCH -C

Das -CFlag weist den Aktualisierungsbefehl an, alle lokalen Änderungen vor dem Aktualisieren zu verwerfen.

Dies kann jedoch dazu führen, dass nicht verfolgte Dateien in Ihrem Repository verbleiben. Es hört sich so an, als ob Sie diese auch loswerden möchten, also würde ich die purgeErweiterung dafür verwenden:

hg pull
hg update -r MY_BRANCH -C
hg purge

In jedem Fall gibt es keinen einzigen Befehl, den Sie Mercurial ausführen lassen können, der alles tut, was Sie hier wollen, außer wenn Sie den Prozess auf die Methode "Vollständiger Klon" ändern, von der Sie sagen, dass Sie dies nicht können.

Lasse V. Karlsen
quelle
6
Danke, es war die "Säuberung", die ich brauchte. Das Update -C entfernt nicht verfolgte Dateien nicht, was die Hauptsache ist, mit der ich zu kämpfen hatte.
Rory
4
Sie können TortoiseHg auch zum Löschen verwenden. Sie müssen nur die Erweiterung in den Einstellungen der Workbench aktivieren (oder mercurial.ini bearbeiten).
Dave
18
Wenn die Bereinigungserweiterung nicht aktiviert ist, können Sie den folgenden Befehl auch verwenden: hg --config "extensions.purge=" purge --all
Samuel Delisle
5
@ csharptest.net hg purge --allgab mir nur gute Kopfschmerzen, da es auch meine lokalen Konfigurationen löschte, dh: Datenbankbenutzer / Passwort usw. :)
VMC
@SamuelDelisle Vielen Dank, mein Herr, ich wollte keine Konfigurationsänderungen nur für diesen einmaligen Befehl in meinem Skript vornehmen!
joonas.fi
113
hg up -C

Dadurch werden alle Änderungen entfernt und auf den neuesten Kopf in der aktuellen Verzweigung aktualisiert.

Und Sie können drehen Säuberung Erweiterung der Lage sein , alle nicht versionierten Dateien zu entfernen.

zerkms
quelle
Umfasst das nicht verfolgte Dateien? Ich hatte einige Probleme mit denen in anderen Befehlen, die ich versuchte. Ich werde es jetzt versuchen ...
Rory
7
@Rory: Nein, hg purgeist für nicht versionierte Dateien.
Zerkms
10

Um nicht verfolgte auf * nix ohne die Bereinigungserweiterung zu löschen, können Sie verwenden

hg pull
hg update -r MY_BRANCH -C
hg status -un|xargs rm

Welches verwendet

Update -r --rev REV Revision

update -C --clean verwerfe nicht festgeschriebene Änderungen (keine Sicherung)

status -u --unknown zeigt nur unbekannte (nicht verfolgte) Dateien an

status -n --no-status Statuspräfix ausblenden

KCD
quelle
4

Wenn Sie nach einer einfachen Methode suchen , sollten Sie diese ausprobieren.

Ich selbst kann mich kaum an Befehlszeilen für alle meine Tools erinnern, daher neige ich dazu, dies über die Benutzeroberfläche zu tun:


1. Wählen Sie zuerst "Festschreiben".

Verpflichten

2. Zeigen Sie dann ignorierte Dateien an. Wenn Sie nicht festgeschriebene Änderungen vorgenommen haben, verbergen Sie diese.

Ignorierte Dateien anzeigen

3. Wählen Sie nun alle aus und klicken Sie auf "Unversioned löschen".

Lösche sie

Getan. Es ist eine Prozedur, die viel einfacher zu merken ist als Kommandozeilen.

Bytecode77
quelle
Ich bin nicht sicher (ich benutze SourceTree selbst), aber diese Screenshots scheinen von TortoiseHg Workbench zu stammen. Im Allgemeinen halte ich UI-basierte Lösungen für hilfreich, aber diese Antwort muss besser gekennzeichnet werden. Außerdem klingt "verstecke sie" für mich etwas vage.
Jon Coombs
3

Der hg-Status zeigt Ihnen alle neuen Dateien an, und dann können Sie sie einfach rm .

Normalerweise möchte ich ignorierte und nicht versionierte Dateien entfernen, also:

hg status -iu                          # to show 
hg status -iun0 | xargs -r0 rm         # to destroy

Und dann folgen Sie mit:

hg update -C -r xxxxx

Dadurch werden alle versionierten Dateien für die Revision xxxx in den richtigen Status versetzt


Um der Tradition des Stapelüberlaufs zu folgen, Ihnen zu sagen, dass Sie dies nicht tun möchten, stelle ich häufig fest, dass diese "Nuclear Option" Dinge zerstört hat, die mir wichtig sind.

Der richtige Weg, dies zu tun, besteht darin, in Ihrem Erstellungsprozess die Option "sauber machen" und möglicherweise auch "wirklich sauber machen" und "distclean machen" zu verwenden.

John Lawrence Aspden
quelle