Ich verwende derzeit TortoiseHg (Mercurial) und habe versehentlich eine falsche Commit-Nachricht übertragen. Wie bearbeite ich diese Übergabemeldung im Projektarchiv?
Antworten
Zu viele Anzeigen?更新しています: 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.
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
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
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)
- See previous answers
- Weitere Antworten anzeigen