Mercurial:Geheime Änderungssätze in das Bundle einschließen?
-
10-12-2019 - |
Frage
Wie kann ich mit Mercurial alle Änderungssätze bündeln, von denen nicht bekannt ist, dass sie sich in einem anderen Repository befinden? einschließlich geheime Änderungssätze?
Ich weiß bundle
'S --base
Option enthält zufällig geheime Änderungssätze, aber ich möchte das nicht --base
Verhalten.(Und es scheint ungewöhnlich seltsam, dass es geheime Änderungssätze gibt stets inbegriffen --base
aber sind niemals enthalten ohne es.Sollte es nicht eine separate Option geben?)
Zu Ihrer Information: Ich möchte im Allgemeinen eine Sicherungskopie aller Änderungssätze erstellen, die sich nur in meinem lokalen Repo befinden, bevor ich versuche, den Verlauf neu zu schreiben.
Lösung
Da hast du recht hg bundle
schließt normalerweise geheime Änderungssätze aus.Dies liegt daran, dass es nur das Äquivalent von ausführt hg outgoing
und Bündeln dieser Änderungssätze.
Also einige Workarounds:
Wenn Sie wissen, dass Sie mindestens einen Entwurf oder einen öffentlichen ausgehenden Änderungssatz als Vorfahren Ihrer geheimen Änderungssätze haben, können Sie diesen verwenden
$ hg bundle --base "parents(outgoing())"
um zu bekommen, was du willst.Der
outgoing()
revset wählt den fehlenden Entwurf und die öffentlichen Änderungssätze aus undparents(outgoing()
werden geeignete Stützpunkte sein.Da du es verwendest--base
Sie erhalten alle Nachkommen (öffentlich, Entwurf und geheim) von diesen Basen.Sie könnten Ihre geheimen Änderungssätze vorübergehend als Entwurf und Bündel festlegen und sie dann wieder als geheim markieren:
$ secret=$(hg log --template "{rev} " -r "secret()"); \ hg phase -d $secret; \ hg bundle out.hg; \ hg phase -f -s $secret
(Ich benutze Zsh und da musste ich verwenden
${=secret}
anstatt$secret
weil Zsh standardmäßig keine Wortaufteilung bei der Parametererweiterung durchführt.)Es ist wichtig, die Befehle mit zu verketten
;
anstatt&&
da Sie die Phasen unabhängig davon, was in der passiert, zurücksetzen möchtenhg bundle
Aufruf – Übergabe falscher Parameter anhg bundle
sollte nicht bedeuten, dass Sie alle Informationen über die geheimen Änderungssätze verlieren.Beachten Sie außerdem, dass bei dieser Technik kein Informationsverlust auftritt, da geheime Changesets nur geheime Nachkommen haben.Sie können dies in einen Shell-Alias umwandeln:
[alias] bundle-all = !secret=$(hg log --template "{rev} " -r "secret()"); hg phase -d $secret; hg bundle $@; hg phase -f -s $secret
Der
$@
wird von Mercurial erweitert, bevor der Alias aufgerufen wird, und so können Sie die erforderlichen Argumente für einfügenhg bundle
.
Beachten Sie, dass Phaseninformationen nicht in Bundles gespeichert werden können – das Bundle-Format wurde nicht entsprechend geändert.
Andere Tipps
Wenn Sie wissen, dass es mindestens ein öffentliches Ändern gibt, können Sie dies verwenden: generasacodicetagpre.
otoh, das nicht funktioniert, wenn keine öffentlichen Änderungen vorhanden sind, verwenden Sie dies statt: generasacodicetagpre.
Das Problem mit der Antwort von Martin ist, dass er auf ausgehender ist, was wiederum auf eine direkte Verbindung zum Push-Repo ist.Wenn Sie nicht immer über eine Internetverbindung mit diesem Repo verfügen, funktionieren diese Methoden für mich gut.Es ist auch etwas einfacher als der Phasentanz.
Ein Test, ob es sich um öffentliche Änderungen gibt, um die Ausgabe von: aufzunehmen: generasacodicetagpre.
und testen Sie seine Länge oder das Vorhandensein von [0-9].