2010-10-17 11 views
8

Ich habe 3 Repositories, jede mit der gleichen Code-Basis erstellt, aber unterschiedlich genug, um verschiedene Repositories zu gewährleisten. Mein "Traum" -Fluss wäre es, im Entwicklungs-Repository zu arbeiten und diese Änderungen dann in die anderen Repositories zu übernehmen. Ich weiß, ich kann dies tun mit so etwas wie:ziehen Dateien von einer bestimmten Revision - mercurial

hg pull -r X -f repo 

aber diese geben mir alle Change X. oben Ist es möglich, nur zu ziehen alle Changesets aus einer bestimmten Revision oder auch aus einer Reihe von Revisionen?

Antwort

7

Wenn Sie den Inhalt bestimmter Differenzmengen und sie auf eine beliebige Kasse (Anmerkung: die resultierenden Differenzmengen verschiedene Change sein, auch wenn sie die gleichen Änderungen machen) greifen wollen, werfen Sie einen Blick an der transplant extension.

+0

Dies ist fast geben mir was ich will außer, dass, wenn ein Konflikt auftritt, ich diese .rej-Dateien anstelle von mir ein Merge-Tool. Kennen Sie einen einfachen Weg, diese .rej-Dateien zu verarbeiten, statt sie manuell zu analysieren und Konflikte zu lösen? – mdonovan2010

+0

Für neuere Leser, die das Problem lösen möchten: Siehe meine aktualisierte Antwort unten für eine integrierte, gut funktionierende Lösung. – Lstor

8

Es gibt keine gut Weg zu Kirsche Pick Revisionen in mercurial (das ist, was der vorgeschlagene Workflow genannt wird). Es gibt einige nicht so gute Möglichkeiten: Export + Import (oder der Convenience Wrapper um den Export + Import, der Transplant genannt wird), aber der Nachteil ist, dass Sie den gleichen Changeset mit verschiedenen Hashes in mehreren Repositories haben, ohne dass es gut ist Möglichkeit, das darzustellen, wenn/wenn Sie versuchen, Änderungen erneut zu verschieben.

Besser ist es, Ihren Workflow so zu modifizieren, dass Sie alle Vorfahren überarbeiten können, indem Sie bewusst die Vorfahren eines Changesets auswählen.

Zum Beispiel, wenn Sie einen Fehler beheben, der im Entwicklungsrepository ist, und alle drei "anderen" Repositorys ändern nicht nur die übergeordnete Revision der Änderung tip des Entwicklungsrepositorys. Zuerst machen Sie eine hg update -r THE_REVISION_WHERE_THE_BUG_WAS_ADDED, dann beheben Sie Ihren Fehler, und dann commit. Sie erhalten eine Nachricht mit der Nachricht new head created, die erwartet wird.

Jetzt hatten Sie dieses Update als Changesets, deren einziges Elternteil das Changeset ist, in dem der Bug eingeführt wurde - das muss in den 3 anderen Repositories existieren oder sie würden den Bug nicht haben. So, jetzt können Sie pull diese neue Änderung in die "3" anderen Repositories, ohne alles andere in Entwicklung mit ihnen zu bringen. Und dann machst du einen schnellen hg merge in jedem dieser vier Repositories, die den Bugfix in ihren deploybaren tip mischen.

Die Handhabung von Repositories mit gemeinsamen Funktionen, aber Anpassungen in jedem, kann ein wenig schwierig sein, aber wenn Sie die Dinge richtig strukturieren, können Sie alle Ihre Intra-Repo-Migrationen mit Push, Pull und Merge durchführen , und muss nie einen Fehler zweimal beheben, denselben Code in verschiedenen Änderungssätzen haben oder die Anpassung eines Repositorys erneut durchführen.

Als eine Anmerkung, der Halbierung Befehl, eine große Arbeit der Beantwortung der Frage "Wo wurde dieser Fehler eingeführt", bevor man beginnt, es zu beheben.

+0

Wenn ich das richtig verstehe, funktioniert dieser Workflow, wenn alle Repositories auf einen gemeinsamen Änderungssatz zurückgeführt werden können? In meiner Situation ist das nicht der Fall. – mdonovan2010

+0

Ja, ich erkenne es nicht, aber und ich meine das ohne "urteilend" zu klingen. Unabhängig davon, wie benutzerdefiniert Ihre Bereitstellungen sind, wenn sie Code gemeinsam haben, sollten sie Klone mit eigenen Changesets sein, die die Anpassung vornehmen - oder sie sollten Subrepos teilen, wenn Sie einen gemeinsamen Bibliothekscode zwischen ihnen haben. Es wäre ein Re-Faktor, aber es würde dich zu dem "Traum-Arbeitsfluss" bringen, auf den du oben Bezug nimmst. –

+0

Ja, dein Recht. Ich bin spät dran mit der Version, die diese Websites kontrolliert ... aber mercurial scheint die perfekte Wahl für das zu sein, was ich tun musste, aber alles neu zu strukturieren, nur um meine Träume zu verwirklichen, könnte meinen Arbeitgeber nicht sehr glücklich machen;) Danke für Ihre Eingabe hat mir definitiv geholfen, besser zu verstehen, wie Mercurial funktioniert. – mdonovan2010

7

Aktualisierte Antwort: Ab Mercurial 2 können Sie den Befehl 'graft' verwenden, der gut funktioniert. Es verwendet einige interne Zusammenführungsfunktionen, um sicherzustellen, dass Sie Konflikte manuell behandeln können. Wenn es keine Konflikte gibt, die Mercurial nicht selbst lösen kann, wird das neue Changeset automatisch über die aktuelle Revision hinaus festgelegt.

Verwandte Themen