Wie verwalten Sie kleinere Änderungen, die Sie in mercurial lokal halten möchten?

9

Ich denke darüber nach, ein 14 Jahre altes Lebenslauf-Repository (Geschichte intakt) auf mercurial zu migrieren. Ich glaube, ich habe alle technischen Konvertierungsaufgaben erledigt, aber ich habe noch einige Fragen zur effektiven Arbeit mit Quecksilber.

Eines der Dinge, die ich häufig in den Lebenslauf-Sandboxen einzelner Entwickler (einschließlich meiner eigenen) sehe, sind lokale, nicht festgeschriebene Änderungen, die nicht bereit sind, auf die Hauptlinie übertragen zu werden. Mein Verständnis ist, dass dies eine schlechte Sache ist. Die meisten meiner Experimente mit hg legen nahe, dass nicht festgeschriebene Änderungen eine schlechte Sache sind. Die Unfähigkeit, mit ihnen zu verschmelzen, reicht dafür aus. Ich möchte also wissen, wie andere Leute, die Quecksilber in der täglichen Codierung verwenden, damit umgehen. Wie gehen Sie mit unvollständigen Codeänderungen um, wenn es darum geht, Ihr Repository zu aktualisieren? Wie gehen Sie mit lokalen Änderungen um, die Sie (noch) nicht mit anderen Entwicklern teilen möchten?

nmichaels
quelle

Antworten:

5

Ich gehe so vor:

In meinem lokalen Repository übertrage ich jede Änderung, auch wenn ich experimentiere. Wenn ich mit dem Experiment einverstanden bin und es getestet wurde, schiebe ich es in das Remote-Repository. Wenn nicht, bleibt es in meinem lokalen Repository (oder kehrt zu einer älteren Version zurück).

Die Idee ist, dass das Remote-Repository nur funktionierende, getestete Versionen meiner Projekte enthält.

Oliver Weiler
quelle
3
Stellen Sie fest, dass Ihr Remote-Repository mit Commits vom Typ "Fehler beim letzten Commit behoben" überfüllt ist?
Nmichaels
4

Es gibt ein paar Dinge, die ich hinzufügen werde.

Eine besteht darin, einen Workflow vorzuschlagen , bei dem das Regal , das standardmäßig mit TortoiseHg geliefert wird , mit Bedacht verwendet wird .

Wann immer ich einen Teil meines aktuellen Arbeitsverzeichnisses festschreiben wollte, habe ich die Änderungen, die ich nicht festschreiben wollte, zurückgestellt, neu kompiliert (um sicherzustellen, dass ich keine Bits zurückgestellt habe, die jetzt zu einer fehlerhaften Kompilierung führen) und dann meine Tests ausgeführt . Dann würde ich das vollständige, funktionierende und getestete Set festlegen. Schließlich würde ich unshelve ausführen, um meine Änderungen wiederherzustellen.

Wenn ich dauerhaftere Änderungen hätte, z. B. wenn eine Konfigurationsdatei auf meinem Entwicklungscomputer immer auf den lokalen Host-Port 3333 und nicht auf den Produktionsserver verweisen soll, würde ich die Verwendung der Mercurial Queues-Erweiterung in Betracht ziehen, die sowohl mit Mercurial als auch mit TortoiseHg geliefert wird .

Mark Booth
quelle
4

Ich glaube nicht, dass unverbindliche Änderungen an sich eine schlechte Sache sind. Sie verweisen auf eine "Unfähigkeit, mit ihnen zusammenzuführen". Wenn Sie eine nicht festgeschriebene Änderung an einer Datei vorgenommen haben und eine Änderung an dieser Datei abrufen und aktualisieren, startet Mercurial den Zusammenführungsprozess so, als hätten Sie ihn festgeschrieben und danach gefragt eine Zusammenführung. Meinten Sie etwas anderes?

Für lokale Änderungen, die Sie noch nicht mit anderen Entwicklern teilen möchten, haben Sie zwei Ansätze. Die erste besteht darin, die Änderungen in Ihrer Arbeitskopie beizubehalten, aber nicht zu verschieben, und die andere darin, sie aus der Arbeitskopie herauszulegen. Welche Sie auswählen, hängt davon ab, ob Sie diese Änderungen während der Arbeit zur Verfügung haben möchten.

Wenn Sie sie in der Arbeitskopie behalten, funktionieren eingehende Änderungen einwandfrei. Sie müssen also nur vermeiden, ausgehende Änderungen zu erstellen, und das bedeutet, dass Sie sie nicht festschreiben müssen. Wenn die Dateien neu sind, ist das einfach - nur nicht hg add. Wenn sie bereits verfolgt werden, können Sie sie ausdrücklich von Commits mit ausschließen hg commit --exclude foo.txt. Wenn Sie eine große Anzahl von Dateien ausschließen müssen oder diese von vielen Commits ausschließen möchten (z. B. für eine dauerhafte Änderung einer lokalen Konfigurationsdatei), sehen Sie sich die Ausschlusserweiterung an .

Wenn Sie bereit sind, die Änderungen beiseite zu schieben, haben Sie andere Optionen. Am einfachsten ist es, hg diffdie Dateien zu verwenden, um einen Patch zu erstellen, der sie beschreibt, den Sie an einem sicheren Ort aufbewahren, und hg patch --no-commitdiesen Patch dann erneut anzuwenden, wenn Sie die Änderungen zurückhaben möchten. Sie können dies reibungsloser gestalten, indem Sie die Regalerweiterung , die Dachbodenerweiterung oder einen anderen Verwandten installieren . Sie können auch die Warteschlangenerweiterung verwenden , aber dazu wird ein Vorschlaghammer verwendet, um eine Nuss zu knacken. Sie können die Änderungen sogar einfach festschreiben, dann auf das übergeordnete Element zurücksetzen und dort andere Arbeiten festschreiben, wobei die Änderungen in einem stumpfen anonymen Zweig verbleiben - hg commit -m 'temporary branch' && hg up $(hg log -r 'parents(.)' --template '{node}')obwohl dies möglicherweise einfacher manuell durchzuführen ist!). Sie müssten dann jedoch darauf achten, diesen Änderungssatz nicht zu verschieben.

Tom Anderson
quelle
3

Zwei grundlegende Ansätze werden verwendet, um Entwicklungsströme zu trennen.

  • Benannte Zweige. Die Idee ist, dass Sie an Ihrem eigenen Zweig arbeiten, dem nmichaels_branch_of_awesome. Auf diese Weise können Sie Ihre Änderungen vornehmen, ohne die Arbeit anderer zu beeinträchtigen. Dann verschmelzen Sie mit anderen Personen, wenn Sie deren Arbeit benötigen, und wenn die Zeit für die Funktion gekommen ist, wechseln Sie zur Integration in den stabileren Zweig. Ich bevorzuge benannte Zweige.

  • Anonymer Klon. Dadurch wird ein separates Repository für Ihre Sandbox erstellt. Hier spielen Sie herum, bis Sie das bekommen, was Sie wollen, dann machen Sie (wahrscheinlich) einen MQ-Patch für Ihre Commits und schieben Sie dorthin, wo Sie angefangen haben. Ich mag diesen Ansatz nicht so sehr, da er eine Verzeichnisverwaltung und möglicherweise MQ-Arbeit erfordert, was schwierig sein kann. Und mit einigen Repos können sie dafür anfangen, nur ein wenig groß zu werden. Dies scheint jedoch von den Ofenentwicklern bevorzugt zu werden.

Paul Nathan
quelle
Es hört sich so an, als gäbe es jemanden, dessen Aufgabe es ist, die Integrationsaufgaben zu erledigen. Ich bin nicht geneigt, mq zur Liste der neuen Dinge hinzuzufügen, die die Leute sofort lernen müssen, aber ich werde über meine anfängliche Abneigung gegen die Idee der benannten Zweige nachdenken. Es könnte nicht begründet sein.
Nmichaels
Warum nicht für Ihre zweite Kugel klonen, arbeiten und erst pushen, wenn Sie fertig sind? MQ klingt hier viel zu kompliziert
TheLQ
@TheLQ: Das funktioniert auch, unterscheidet sich aber nicht vom direkten Klonen aus dem Basis-Repo. MQ würde Commits zu einem Commit zusammenfassen.
Paul Nathan