Kann ich den Benutzernamen in einem Mercurial Changeset ändern?


73

Ich habe den Benutzernamen auf meinem Entwicklungscomputer nicht festgelegt und einige Festschreibungen vorgenommen. Kann ich den Benutzernamen rückwirkend ändern, damit klar ist, wer diese Änderungssätze festgeschrieben hat?


Lesen Sie das folgende Dokument. Das Umschreiben des Verlaufs, der im Dokument behandelt wird, hat einige Nachteile, so dass er normalerweise verpönt ist. Es scheint jedoch möglich zu sein. - Bearbeiten der Geschichte
Dave K

Antworten:


84

Wenn Sie Ihr Repository nicht veröffentlicht haben, sollte dies nicht zu schwierig sein. Sie müssen die Erweiterung "In Mercurial konvertieren" verwenden , mit der Sie Ihr vorhandenes Repository "filtern" können, um ein neues zu erstellen. Mit der Option --authors können Sie den Autor für jedes Commit bearbeiten, während es gefiltert wird.

Wenn Sie haben Ihr Repository veröffentlicht, bitte die Auswirkungen auf die Benutzer berücksichtigen, hat das Quecksilber-Wiki einige Gründe , nicht zu bearbeiten Geschichte .

Aktivieren Sie die Erweiterung, indem Sie diese Zeilen zu Ihrer .hgrc hinzufügen:

[extensions]
hgext.convert=

Schreiben Sie eine Datei, um den alten Namen dem neuen Namen zuzuordnen (autors.convert.list):

user@ubuntu=real.name@my.example.com

Führen Sie die Konvertierung aus:

hg convert --authors authors.convert.list SOURCE DEST

Ich habe es gerade überprüft, es funktioniert für mich :).


@ Andrew Aylett: Wie hast du das überprüft? "$ hg clone myWrongRep name", hat die Änderungen vorgenommen und dann "$ hg convert --authors theFile myWrongLocalRep". Jetzt wird eine ".-Hg" -Datei generiert und die Site sagt, dass es etwas mit "hg-Status" geben sollte, aber ich kann nichts finden (obwohl dies der Fall ist. Ich hatte ein falsches Autoren-Commit mit dem Namen "hh", also habe ich eine Zeile "hh" erstellt = hhh 'in die Datei aber nach dem Push, jetzt ändern und nach "$ hg update" und "$ hg push" keine Änderung. Was fehlt mir?
hhh

Sie können die Autoren überprüfen / überprüfen, ob Befehle mit diesem Befehl funktionieren $ hg log --template '{author}\n'|less, aber noch nicht funktionieren - ohne die authormap -thing zu verstehen.
hhh

Angenommen, ich möchte "userA userA@gmail.com" in "userB userA@gmail.com" und "useA userA@gmail.com" in "userA userA@gmail.com" ändern. Was steht in dieser Syntax oben? Ich habe viele Varianten ausprobiert, bin aber zu vielen unterschiedlichen Ergebnissen gekommen, ohne das Trennzeichen zu verstehen.
hhh

4
Das hat bei mir nicht funktioniert. Es hat die gesamte Geschichte neu geschrieben, ob ich der Autor war oder nicht. Danach schlägt der Rebase fehl. Gibt es eine Möglichkeit, nur aktuelle, nicht gepusste Commits zu konvertieren?
Tobu

7
Es wäre auch hilfreich, wenn Sie erklären würden, was "SOURCE" und "DEST" sein sollen. Wege? Leider erklärt selbst die Hilfe von hg nicht, was sie sind.
Thomas Tempelmann

17

Wenn Sie einen einzelnen ausgehenden Änderungssatz haben, gibt es eine sehr einfache Möglichkeit, dies zu tun:

$ hg ci --amend --user "My Name <mymail@example.org>" -X "**"

Die -X "**"Option kann weggelassen werden, wenn Sie keine lokalen Änderungen haben.


Danke, das hat bei mir einfach gut funktioniert. Gott, ich liebe Quecksilber - das tue ich wirklich, aber kleine Dinge wie diese sind in hg schwieriger als in git. Z.B. in git ist es --reset-author. Für hg gibt es immer viele Lösungen, wie wir sie in diesem Thread sehen, und alle sind schmerzhaft und schwierig (außer Ihrer). Vielen Dank!
Alex

14

Ich habe verschiedene Methoden ausprobiert (einschließlich der Konvertierungserweiterung , bei der ich festgestellt habe, dass sie ein nicht verwandtes Repository erstellt hat). Die Mercurial-Wiki-Anweisungen zum Bearbeiten des Verlaufs mit MQ waren für mich am hilfreichsten. (Es gibt natürlich die üblichen Einschränkungen beim Bearbeiten eines öffentlich bekannten Verlaufs, die eine schlechte Idee sind, aber lokale Änderungssätze, die nur Sie haben, können bearbeitet werden.)

Ich werde hier die entscheidenden Schritte zusammenfassen und die Mechanismen des Autorenwechsels erläutern. Angenommen, das erste falsche Autoren-Commit befindet sich in der Revision BAD(und Sie haben Ihre Änderungen natürlich nirgendwo veröffentlicht), sollten Sie in der Lage sein, Folgendes zu tun (ich gehe davon aus, dass Sie sich im Repository-Stammverzeichnis befinden):

Aktivieren Sie MQ, indem Sie dies zu $ ​​HOME / .hg / hgrc hinzufügen

[extensions]
hgext.mq=

Konvertieren Sie die letzten Änderungssätze in Patches:

$ hg qimport -r BAD:tip

(Sie können jetzt bei gefunden werden .hg/patches)

"Nicht anwenden" aller Patches (vorausgesetzt, sie wurden angewendet und umgekehrt), um Ihr Repository in den Status der vorherigen Revision zu versetzen BAD:

$ hg qpop -a

Wenn Sie sich Ihre Patches ansehen, werden Sie feststellen, dass der Autor in allen Patches in einer Art Kommentarzeile codiert ist:

$ grep User .hg/patches/*
.hg/patches/102.diff:# User Firstname Lastname <f.lastname@oops.wrongurl.example.com>

Verwenden Sie jetzt Ihr bevorzugtes Such- / Ersetzungswerkzeug, um die Patches zu reparieren (ich verwende hier Perl). Nehmen wir an, Sie möchten, dass der Commit-Name lautet f.lastname@righturl.example.com:

$ perl -pi -e 's/f\.lastname\@oops\.wrongurl\.example\.com/f.lastname\@righturl.example.com/' .hg/patches/*.diff

Überprüfen Sie nun, ob Sie den Autorennamen erfolgreich geändert haben, und wenden Sie die Patches erneut an:

$ hg qpush -a

Konvertieren Sie dann die angewendeten Patches in die richtigen Änderungssätze:

$ hg qfinish -a

Und du bist fertig. Ihr Repository wird weiterhin als verwandt aufgeführt, sodass Sie keine Beschwerden über das Pushing erhalten.


Got "Abbruch: Merge Revision [Revisionsnummer] kann nicht importiert werden
Meetai.com

1
Hat für mich gearbeitet. Ich musste jedoch zuerst den Status meiner Commits von "veröffentlicht" in "Entwurf" ändern.
user2428118

/Vor dem abschließenden Anführungszeichen war ein Nachlauf erforderlich, andernfalls perlergab der Befehl einen Fehler Substitution replacement not terminated at -e line 1. Ansonsten perfekt, danke!
ederag

1
Tolle Lösung, sehr hilfreich!
Alexander K

11

Ich habe die histeditErweiterung verwendet, mit der ich den Autor ändern konnte, ohne neue Repos wie "convert" zu erstellen oder auf "mq" zurückzugreifen.

Stellen Sie zunächst in Ihrer Mercurial-Konfigurationsdatei sicher, dass Ihr Benutzername korrekt eingestellt ist, und aktivieren Sie die Erweiterung histedit:

[ui]
username = Your Name <your.name@domain.org>

[extensions]
histedit =

Wenn Sie dann Revision 40 ändern möchten, verwenden Sie:

hg histedit -r 40

Ändern Sie in der angezeigten Datei in der Zeile, die der Revision 40 entspricht, das Wort pickin edit. Speichern und schließen Sie die Datei.

Nun hg commit. Sie müssen Ihre Festschreibungsnachricht erneut eingeben und speichern.

Schließlich hg histedit --continue.

Das Commit wird mit Ihrem neuen angezeigt username. Ein Nebeneffekt ist, dass der Zeitstempel des Commits ebenfalls aktualisiert wird.


Es scheint nicht zu funktionieren: "Verlassen: Kann nur einen Änderungssatz zusammen mit all seinen Nachkommen
bearbeiten
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.