338 Stimmen

Wie kann ich eine falsche Commit-Nachricht in Mercurial bearbeiten?

Ich verwende derzeit TortoiseHg (Mercurial) und habe versehentlich eine falsche Commit-Nachricht übertragen. Wie bearbeite ich diese Übergabemeldung im Projektarchiv?

255voto

Thilo Punkte 248982

更新しています: Mercurial hat hinzugefügt --amend die sein sollten die jetzt bevorzugte Option .


Sie können die letzte Übergabe (aber nur die letzte) zurücknehmen mit hg rollback und tragen Sie es dann erneut auf.

Wichtig : dies entfernt dauerhaft die letzte Übertragung (oder ziehen). Wenn Sie also eine hg update diese Übertragung nicht mehr in Ihrem Arbeitsverzeichnis ist, ist sie für immer verloren. Machen Sie also zuerst eine Kopie.

Abgesehen davon können Sie die Historie des Repositorys (einschließlich der Commit-Nachrichten) nicht ändern, da alles darin prüfsummiert ist. Das Einzige, was Sie tun könnten, ist, die Historie nach einem bestimmten Änderungssatz zu löschen und sie dann entsprechend neu zu erstellen.

Nichts davon wird funktionieren, wenn Sie Ihre Änderungen bereits veröffentlicht haben (es sei denn, Sie können an alle Kopien herankommen), und Sie können auch keine "Geschichte umschreiben", die GPG-signierte Commits (von anderen Personen) enthält.

92voto

Antonio Beamud Punkte 2221

Nun, ich habe das immer so gemacht:

Stellen Sie sich vor, Sie haben 500 Commits, und Ihre fehlerhafte Commit-Nachricht steht in r.498.

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

70voto

prime23 Punkte 3282

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

und in tortoiseHg können Sie "Aktuelle Revision ändern" verwenden, indem Sie den schwarzen Pfeil rechts neben der Schaltfläche "Übertragen" auswählen

a

49voto

Curious2learn Punkte 28623

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

http://knowledgestockpile.blogspot.com/2010/12/changing-commit-message-of-revision-in.html

20voto

maxschlepzig Punkte 31061

Die letzte Operation war die fragliche Übertragung

Um die Übergabemeldung der letzten Übergabe zu ändern, wenn die letzte Mercurial-Operation eine Übergabe war, können Sie verwenden

$ hg rollback

um die letzte Übergabe rückgängig zu machen und sie mit der neuen Nachricht erneut zu übergeben:

$ hg ci -m 'new message'

Seien Sie jedoch vorsichtig, denn der Befehl rollback macht auch die nachfolgenden Operationen rückgängig:

  • i
    • ziehen
    • push (mit diesem Repository als Ziel)
    • entbündeln

(siehe hg help rollback )

Wenn Sie also nicht sicher sind, ob der letzte Mercurial-Befehl ein hg ci verwenden Sie nicht hg rollback .

Ändern Sie jede andere Übergabemeldung

Sie können die mq-Erweiterung die mit Mercurial ausgeliefert wird, um die Commit-Nachricht eines beliebigen Commits zu ändern.

Dieser Ansatz ist nur dann sinnvoll, wenn es nicht bereits geklonte Repositorys in der Öffentlichkeit gibt, die den umzubenennenden Changeset enthalten, da dadurch der Hash des Changesets und aller folgenden Changesets geändert wird.

Das bedeutet, dass Sie in der Lage sein müssen, alle vorhandenen Klone zu entfernen, die das umzubenennende Changeset enthalten, sonst würde das Verschieben zwischen ihnen nicht funktionieren.

Um die mq-Erweiterung zu verwenden, müssen Sie sie explizit aktivieren, z.B. unter UNIX in Ihrem ~/.hgrc , die folgende Zeilen enthalten sollte:

[extensions]
mq=

Angenommen, Sie wollen Revision X ändern - zuerst qimport importiert die Revisionen X und folgende. Jetzt werden sie als Stapel von angewandten Patches registriert. Popping ( qpop ) den gesamten Stapel außer X für Änderungen über qrefresh . Nachdem die Commit-Nachricht geändert wurde, müssen Sie alle Patches erneut pushen ( qpop ), um sie erneut anzuwenden, d. h. um die folgenden Revisionen neu zu erstellen. Der Stapel von Patches wird nicht mehr benötigt, daher kann er mit qfinish .

Das folgende Demo-Skript zeigt alle Vorgänge in Aktion. In diesem Beispiel wird die Commit-Nachricht des dritten Changesets umbenannt.

# test.sh
cd $(dirname $0)
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
echo '[extensions]' >> .hg/hgrc
echo 'mq=' >> .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 on 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 $(hg identify -n -r 'children(2)'):tip
hg qseries
echo INFO: Pop patches
hg qpop -a
hg qseries
hg log 
hg parent
hg commit --amend -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 und führen Sie es z.B. über aus:

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

Die Ausgabe sollte die ursprüngliche Änderungsnachricht enthalten:

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

Und der Umbenennungsvorgang die geänderte Nachricht:

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

(Getestet mit Mercurial 4.5.2)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X