Frage

    

Diese Frage bereits eine Antwort hier:

    
            
  •              Mercurial: Wie die letzten Commit ändern                                      7 Antworten                          
  •     
    

Ich bin derzeit TortoiseHg (Mercurial) und verpflichtet sich versehentlich eine falsche Nachricht begehen. Wie gehe ich über diese Nachricht in dem Repository zu bearbeiten?

War es hilfreich?

Lösung

Update:. Mercurial hinzugefügt --amend die jetzt


Sie Rollback kann die letzte commit (aber nur die letzte) mit hg rollback und dann erneut anwenden es.

Wichtig : Die dauerhaft entfernt die letzte commit (oder ziehen). Wenn Sie also eine hg update getan, dass begehen ist nicht mehr in Ihrem Arbeitsverzeichnis dann für immer verloren es. So eine Kopie zuerst machen.

Other than that, können Sie nicht die Geschichte des Repository ändern (einschließlich Commit-Nachrichten), weil alles da drin Check-summierte ist. Das einzige, was Sie tun können, ist die Geschichte nach einer bestimmten changeset beschneiden, und es dann entsprechend neu zu erstellen.

Nichts davon wird funktionieren, wenn Sie bereits Ihre Änderungen veröffentlicht haben (es sei denn, Sie halten alle Kopien erhalten können), und man kann auch nicht „die Geschichte umschreiben“, die GPG-signierte Commits umfassen (von anderen Personen).

Andere Tipps

Nun, habe ich auf diese Weise tun:

Stellen Sie sich vor, Sie 500 Commits haben und Ihre fehlerhafte Nachricht in r.498 begehen ist.

hg qimport -r 498:tip
hg qpop -a
joe .hg/patches/498.diff
(change the comment, after the mercurial header)
hg qpush -a
hg qdelete -r qbase:qtip

Gute Nachrichten: hg 2.2 gerade hinzugefügt git wie --amend Option.

und in TortoiseHg, können Sie „ändern aktuelle Revision“ von ausgewählten schwarzen Pfeil auf der rechten Seite der Commit-Taste

verwenden

a

Ich weiß, dass dies eine alte Post und Sie markiert die Frage beantwortet. Ich war auf der Suche nach der gleichen Sache vor kurzem, und ich fand die histedit Erweiterung sehr nützlich. Das Verfahren wird hier erklärt:

http: //knowledgestockpile.blogspot. com / 2010/12 / Wechsel-commit-message-of-Revision-in.html

letzte Operation des in Frage commit

Um die Commit zu ändern Meldung der letzten begehen, wenn die letzte Quecksilber-Operation ein begehen können Sie

$ hg rollback

die letzte begehen und wieder begehen es mit der neuen Nachricht ein Rollback:

$ hg ci -m 'new message'

Aber vorsichtig sein, da der Rollback-Befehl auch wieder folgende Operationen Rollen:

  
      
  • Import      
        
    • Pull
    •   
    • push (mit diesem Repository als Ziel)
    •   
    • entflechten
    •   
  •   

(siehe hg help rollback)

Wenn Sie also nicht sicher sind, ob der letzte Quecksilber-Befehl war ein hg ci, nicht hg rollback nicht verwendet werden.

Ändern Sie andere Commit-Nachricht

Sie können mit der mq Erweiterung , die mit Mercurial verteilt wird, die Commit-Nachricht von jedem begehen zu ändern.

Dieser Ansatz nur dann sinnvoll ist, wenn es nicht bereits Repositories in der Öffentlichkeit geklont, die die changeset Sie umbenennen möchten enthalten, da dies den Hash davon changeset verändert und alle folgenden Differenzmengen.

Das bedeutet, dass Sie alle vorhandenen Klone in der Lage sein zu entfernen, die die changeset schließen Sie umbenennen möchten, oder Schieben / Ziehen zwischen ihnen würde nicht funktionieren.

Um die mq Erweiterung nutzen zu können muss es explizit aktivieren, z.B. unter UNIX überprüfen Sie Ihre ~/.hgrc, die folgenden Zeilen enthalten:

[extensions]
mq=

Nehmen wir an, Sie wollen X Revision ändern - zuerst qimport Importe Revisionen X und folgende. Jetzt sind sie als Stapel angewendet Patches registriert. Popping (qpop) wird der gesamte Stapel außer X macht X für Änderungen über qrefresh verfügbar. Nachdem die Commit-Nachricht geändert wird, müssen Sie alle Patches erneut drücken (qpop), um sie wieder anzuwenden, das heißt die folgenden Revisionen zu erstellen. Der Stapel von Patches wird jede nicht benötigt, so kann er über qfinish entfernt werden.

Nach der Demo-Skript zeigt alle Operationen in Aktion. Im Beispiel wird die Commit-Nachricht von Dritt changeset umbenannt.

# test.sh
set -x -e -u
echo INFO: Delete old stuff
rm -rf .hg `seq 5`
echo INFO: Setup repository with 5 revisions
hg init
echo '[ui]' > .hg/hgrc
echo 'username=Joe User <juser@example.org>' >> .hg/hgrc
echo 'style = compact' >> .hg/hgrc
for i in `seq 5`; do
  touch $i && hg add $i && hg ci -m "changeset message $i" $i
done
hg log 
echo INFO: Need to rename the commit message or the 3rd revision
echo INFO: Displays all patches
hg qseries
echo INFO: Import all revisions including the 3rd to the last one as patches
hg qimport -r 2:tip
hg qseries
echo INFO: Pop patches
hg qpop 2.diff
hg qseries
hg log 
hg parent
hg qrefresh -m 'CHANGED MESSAGE'
hg log 
echo INFO: Push all remaining patches
hg qpush -a
hg log 
hg qseries
echo INFO: Remove all patches
hg qfinish -a
hg qseries && hg log && hg parent

Kopieren Sie es in ein leeres Verzeichnis ein ausführen es zum Beispiel über:

$ bash test.sh 2>&1 | tee log

Die Ausgabe sollte die ursprüngliche changeset Nachricht enthalten:

+ hg log
[..]
2   53bc13f21b04   2011-08-31 17:26 +0200   juser
  changeset message 3

Und der Umbenennungsvorgang der geänderte Nachricht an:

+ hg log
[..]
2   3ff8a832d057   2011-08-31 17:26 +0200   juser
  CHANGED MESSAGE

(Getestet mit Mercurial 1.7.5)

In TortoiseHg der rechten Maustaste auf die Revision, die Sie ändern möchten. Wählen Sie Ändern Geschichte-> Import MQ. Das konvertiert alle Versionen bis einschließlich der gewählten Revision von Mercurial Changesets in Mercurial Queue-Patches. Wählen Sie den Patch Sie die Nachricht ändern, und es sollte automatisch den Bildschirm in den MQ-Editor ändern. Bearbeiten Sie die Nachricht, die in der Mitte des Bildschirms, und klicken Sie auf QRefresh. Schließlich rechts auf dem Patch klicken und Ändern Geschichte-> Finish-Patch wählen, die es von einem Patch konvertieren zurück in eine Änderung Satz.

Oh, das davon ausgeht, dass MQ ist eine aktive Erweiterung für TortoiseHG auf diesem Repository. Wenn nicht, sollten Sie in der Lage sein, File-> Einstellungen, klicken Sie auf Erweiterungen, und klicken Sie auf die Checkbox mq. Es sollte Sie warnen, dass Sie TortoiseHg zu schließen, bevor die Erweiterung aktiv ist, so schließen und wieder öffnen.

Wie andere die MQ Erweiterung erwähnt haben, ist viel besser geeignet für diese Aufgabe, und Sie laufen nicht Gefahr, Ihre Arbeit zu zerstören. Um dies zu tun:

  1. Aktivieren Sie die MQ-Erweiterung, durch so etwas zu Ihrem hgrc und fügte hinzu:
    [extensions]
    mq =
    
  2. Update auf die changeset Sie bearbeiten möchten, in der Regel Spitze:
    hg up <rev>
    
  3. Importieren Sie die aktuelle changeset in die Warteschlange:
    hg qimport -r .
    
  4. Aktualisieren Sie den Patch, und bearbeiten Sie die Commit-Nachricht:
    hg qrefresh -e
    
  5. Beende alle angewendet Patches (ein, in diesem Fall) und speichert sie als reguläre Changesets:
    hg qfinish -a
    

Ich bin nicht vertraut mit TortoiseHg, aber die Befehle sollten die oben ähnlich sein. Ich glaube auch, es ist erwähnenswert, dass die Bearbeitung der Geschichte ist riskant; Sie sollten es nur tun, wenn Sie absolut sicher, dass die Differenzmenge wurde nicht gedrückt oder von anderswo gezogen.

Rollback-and-Neuanlage ist wirklich einfache Lösung, aber es kann nur mit dem letzten Commit helfen. Mercurial Queues ist viel mächtiger Sache (beachten Sie, dass Sie href="http://mercurial.selenic.com/wiki/MqExtension" zum Mercurial Queues Erweiterung aktivieren, um zu verwenden, "hg q *" Befehle).

Ich habe es auf diese Weise. Erstens drücken die Änderungen nicht oder Sie sind kein Glück. Zupacken und die Erweiterung kollabieren. Commit andere dummy changeset. Dann Zusammenbruch verwenden, um die vorherigen zwei Differenzmengen zu einem kombinieren. Es fordert Sie auf, eine neue Nachricht begehen, die Nachrichten zu geben, die Sie bereits als Ausgangspunkt haben. Sie haben Ihre ursprüngliche Commitnachricht effektiv geändert.

Ein Hack, den ich verwenden, wenn die Revision i bearbeiten möchten nicht so alt ist:

Angenommen, Sie bei rev sind 500, und Sie wollen 497 bearbeiten.

hg export -o rev497 497
hg export -o rev498 498
hg export -o rev499 499
hg export -o rev500 500

Bearbeiten rev497-Datei und die Nachricht ändern. (Es ist nach dem ersten Zeilen mit vorangestellten „#“)

hg import rev497
hg import rev498
hg import rev499
hg import rev500

Es gibt einen anderen Ansatz mit dem MQ-Erweiterung und der Debug-Befehle . Dies ist eine allgemeine Art und Weise Geschichte zu ändern, ohne Daten zu verlieren. Lassen Sie mich die gleiche Situation wie Antonio übernehmen.

// set current tip to rev 497
hg debugsetparents 497
hg debugrebuildstate
// hg add/remove if needed
hg commit
hg strip [-n] 498

Ein kleines Juwel in der Diskussion über - dank @Codest und @ Kevin Pullin. In TortoiseHg gibt es eine Drop-Down-Option neben den Knopf begehen. „Ändern aktuelle Revision“ Auswahl bringt den Kommentar und die Liste der Dateien zurück. SO nützlich.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top