Was ist der Unterschied zwischen hg vergessen und hg entfernen?

313

Ich möchte, dass mercurial mehrere Dateien aus dem aktuellen Status des Repositorys entfernt. Ich möchte jedoch, dass die Dateien im vorherigen Verlauf vorhanden sind.

Wie kann forgetund removeunterscheiden, und sie tun können , was ich will?

Paul Nathan
quelle
27
Keine Sorge, Sie können eine Datei nicht aus dem vorherigen Verlauf in Mercurial entfernen. Der Verlauf ist im Allgemeinen unveränderlich, es sei denn, Sie verwenden Erweiterungen.
Martin Geisler

Antworten:

348

' hg forget' ist nur eine Abkürzung für ' hg remove -Af'. Aus der ' hg remove' Hilfe:

... und -Af können verwendet werden, um Dateien aus der nächsten Revision zu entfernen, ohne sie aus dem Arbeitsverzeichnis zu löschen.

Fazit: ' remove' löscht die Datei von Ihrer Arbeitskopie auf der Festplatte (sofern Sie sie nicht verwenden -Af) und ' forget' nicht.

Ry4an Brase
quelle
7
"hg vergessen" wird in Mercurial 1.3 wieder eingeführt, um "hg remove -Af" einfacher zu machen. Es plant das Löschen der Datei, ohne sie aus der Arbeitskopie zu entfernen.
Martin Geisler
5
Froh das zu hören. 'remove -Af' (und die gesamte Tabelle mit Optionen auf der Hilfeseite 'remove') ist / war verrückt.
Ry4an Brase
32
@ Ry4an: Im Ernst, es war lächerlich. Ich habe den Patch beigesteuert, der "Vergiss" wieder eingeführt hat. Als ich es machte, wurde mir klar, dass -Af im Code völlig sinnvoll war, aber aus Sicht eines Benutzers war es völlig lächerlich.
Steve Losh
10
Heh, das ist das Tolle an mercurial - die Leute denken aktiv und iterativ darüber nach, was aus Sicht eines Benutzers Sinn macht. Danke, dass du das behoben hast.
Ry4an Brase
9
Lokale Build-Konfigurationsdateien oder ähnliches? Pfade zu lokalen Tools, die sich von System zu System unterscheiden? Versehentlich eine Protokolldatei hinzugefügt, die Sie nicht in der Quellcodeverwaltung haben möchten, sondern speichern möchten? Ich denke es passiert.
Ry4an Brase
42

Der beste Weg, dies zu tun, hg forgetist identisch mit dem hg remove Unterschied, dass die Dateien in Ihrer Arbeitskopie zurückbleiben . Die Dateien bleiben als nicht verfolgte Dateien zurück und können jetzt optional mit einem Muster in ignoriert werden .hgignore.

Mit anderen Worten, ich kann nicht sagen, ob Sie verwendet haben hg forgetoder hg removewann ich von Ihnen ziehe. Eine Datei , die Sie lief hg forgetauf wird , wenn ich zu diesem changeset aktualisieren gelöscht werden - so als ob Sie benutzt hatte , hg removestatt.

Martin Geisler
quelle
27

In der Dokumentation können Sie anscheinend beide Befehle verwenden, um die Datei im Projektverlauf zu behalten. Sieht so aus, als ob Sie entfernen möchten, da dadurch auch die Datei aus dem Arbeitsverzeichnis gelöscht wird.

Aus dem Mercurial-Buch unter http://hgbook.red-bean.com/read/ :

Das Entfernen einer Datei hat keinen Einfluss auf den Verlauf. Es ist wichtig zu verstehen, dass das Entfernen einer Datei nur zwei Auswirkungen hat. Es entfernt die aktuelle Version der Datei aus dem Arbeitsverzeichnis. Es hindert Mercurial daran, Änderungen an der Datei ab dem Zeitpunkt des nächsten Commits zu verfolgen. Durch das Entfernen einer Datei wird der Verlauf der Datei in keiner Weise geändert.

Die Manpage hg (1) sagt dies über vergessen:

Markieren Sie die angegebenen Dateien, damit sie nach dem nächsten Commit nicht mehr verfolgt werden. Dadurch werden nur Dateien aus dem aktuellen Zweig entfernt, nicht aus dem gesamten Projektverlauf, und sie werden nicht aus dem Arbeitsverzeichnis gelöscht.

Und das über entfernen:

Planen Sie die angegebenen Dateien für das Entfernen aus dem Repository. Dadurch werden nur Dateien aus dem aktuellen Zweig entfernt, nicht aus dem gesamten Projektverlauf.

Jason Catena
quelle
3

Wenn Sie "hg remove b"eine Datei mit dem Status "A" verwenden, was bedeutet, dass sie hinzugefügt, aber nicht festgeschrieben wurde, antwortet Mercurial:

  not removing b: file has been marked for add (use forget to undo)

Diese Antwort ist eine sehr klare Erklärung für den Unterschied zwischen Entfernen und Vergessen.

Meines Wissens nach dient dies dazu, "hg forget"eine hinzugefügte, aber nicht festgeschriebene Datei rückgängig zu machen, damit sie nicht von der Versionskontrolle verfolgt wird. while "hg remove"dient zum Herausnehmen einer festgeschriebenen Datei aus der Versionskontrolle.

Dieser Thread enthält ein Beispiel für die Verwendung hg removegegen Dateien mit 7 verschiedenen Statustypen.

gm2008
quelle
2

Eine Datei kann nachverfolgt werden oder nicht. Sie verwenden hg add , um eine Datei zu verfolgen, und hg remove oder hg vergessen, die Nachverfolgung aufzuheben. Wenn Sie hg remove ohne Flags verwenden, wird die Datei sowohl gelöscht als auch nicht mehr verfolgt. Hg vergessen wird sie einfach entfernen, ohne sie zu löschen.

Tao
quelle
3
Ich weiß nicht, warum Sie dieses Zitat hinzufügen mussten, als der Mann selbst bereits einsprang, aber hey, was auch immer Ihr Boot schwimmt.
Nathan Tuggy