2010-04-23 13 views
7

In den guten alten Tagen von Subversion konnte ich manchmal eine neue Datei von einer bestehenden ableiten, die svn copy verwendet. Wenn sich dann etwas in Abschnitten änderte, die sie gemeinsam hatten, konnte ich immer noch svn merge verwenden, um die abgeleitete Version zu aktualisieren.Kann ich in Mercurial Änderungen von einer Datei auf eine andere Datei in derselben Verzweigung anwenden?

Um das Beispiel von hginit.com zu verwenden, sagen Sie, dass das "guac" Rezept bereits existiert, und ich will einen "superguac" schaffen, der Anweisungen enthält, wie man 1000 rauschenden Fußballfans Guacamole dient. Unter Verwendung des gerade beschriebenen Prozesses könnte ich:

svn cp guac superguac 
svn ci -m "Created superguac by copying guac" 
(edit superguac) 
svn ci -m "Added instructions for serving 1000 raving soccer fans to superguac" 
(edit guac) 
svn ci -m "Fixed a typo in guac" 
svn merge -r3:4 guac superguac 

und somit die Tippfehlerkorrektur auf Superguac angewendet werden.

Mercurial bietet einen hg copy Befehl, der eine Datei als eine Kopie des Originals markiert, aber ich bin nicht sicher, ob die Repository-Struktur einen ähnlichen Workflow unterstützt. Hier ist das gleiche Beispiel, und ich sorgfältig bearbeiten nur eine einzelne Datei in die befehle ich in der Zusammenführung verwenden möchten:

hg cp guac superguac 
hg ci -m "Created superguac by copying guac" 
(edit superguac) 
hg ci -m "Added instructions for serving 1000 raving soccer fans to superguac" 
(edit guac) 
hg ci -m "Fixed a typo in guac" 

Ich möchte jetzt die Änderung in guac zu superguac anzuwenden. Ist das möglich? Wenn ja, was ist der richtige Befehl? Gibt es in Mercurial einen anderen Workflow, der dieselben Ergebnisse erzielt (auf einen Zweig beschränkt)?

+0

ich dieses spezielle Beispiel erkennen aussieht, ist ziemlich einfach Zweige zur Neufassung mit und Mercurial löst diese Situation trivial. Leider benötige ich in meiner realen Anwendung beide Dateien im selben Zweig, daher meine Schwierigkeit ... – Stephen

+0

Nachdem ich darüber mehr nachgedacht habe (und beide Lösungen in meinem Repo getestet habe), denke ich, dass beide Antworten von Nutzen sind. Wenn ich die Antwort von Rudi vorher gekannt hätte, könnten alle Änderungen, die für beide Dateien gelten, seine Methode verwenden. Leider, da ich beide Dateien nach der Kopie bearbeitet habe, bietet Ry4ans Lösung mir einen Workaround. Danke geht an beide! – Stephen

Antwort

6

Sie können dies tun, indem

hg cp guac superguac 
hg ci -m "Created superguac by copying guac" # CS1 
(edit superguac) 
hg ci -m "Added instructions for serving 1000 raving soccer fans to superguac" # CS2 
hg up -r revision-before-copy 
(edit guac) 
hg ci -m "Fixed a typo in guac" #CS3 
hg merge # this will transfer the typo-fix both to guac and superguac 
hg ci -m "merged typo-fix from guac" # CS4 

Danach wird das Repository wie dieses

CS1 <--- CS2 <--------- CS4 
    \     /
    \--<-------- CS3 -<-/ 
+0

Oh, das ist hinterhältig ... (obwohl ich vom richtigen Standpunkt aus denke, dass es nicht so ist). Also erstellt Ihre Lösung mehrere Köpfe und führt sie dann zusammen.Aber auf einer tieferen Ebene "fügt" diese Methode eine Änderung in der Geschichte von Superguac aus der chronologischen Reihenfolge ein. Das ist wirklich cool, und ich denke, mein mentales Modell von DVCS hat sich gerade verbessert! Vielen Dank! – Stephen

+0

Einer der klarstellenden Punkte, die DVCS gegenüber CVCS hat, ist, dass Letzteres zwingt Sie, die Commit-Geschichte linearer zu betrachten, und in Bezug auf "Revisionen". Ersteres hat eine DAG im Zentrum seines Geschichtsmodells, das viel flexibler ist, und Sie sollten Commits als Sets von "Changes" betrachten. – Santa

+0

@Santa Ich habe über die DAG gelesen, aber ich glaube, ich hatte es noch nicht wirklich verinnerlicht. Dies ist ein wirklich gutes Beispiel, um mir zu helfen, zu verankern, was die DAG in DVCS wirklich bedeutet (und ich teile es auch im Büro, um anderen zu helfen, das Konzept zu verstehen). – Stephen

9

Es gibt keine reinen Quecksilber-Wege-Kreuz-Datei mit Patches zu gehen, aber wenn patch auf Ihrem System installiert ist, Sie, indem Sie auf Ihre Serie von Quecksilber-Befehlen mit im Wesentlichen das Gleiche erreichen könnten:

hg log -p -r tip -I quac | patch superquac 

das sagt im wesentlichen: „nehmen sie die diff (-p), die angewandt wurde Quac (-I quac) in der jüngsten changeset (-r tip) senden es an die Standardausgabe (hg log) einzureichen, und verwenden, die als Eingabe für den Patch (| patch) Befehl wirkt auf fi le superquac (superquac).

+0

Hm ... Für eine Nicht-HG-Lösung ist dies nett und prägnant. Außerdem frage ich mich, ob eine hg-Erweiterung in Ordnung sein könnte. Vielen Dank! – Stephen

+0

Mayhaps. Ich übersprang svn und ging von CVS direkt zu mercurial, also wusste ich nie, dass svn diese Funktionalität hatte. Ehrlich gesagt, es klingt wie etwas, das eine gute Refactoring von der Art, die die gleiche Patch in mehrere Dateien vermeiden würde entmutigen würde. –

+0

Ausgehend von dem, was 'hg help log' sagt, sollte es möglich sein, auch einen anderen Zweig anzugeben ('--branch BRANCH') und somit auch Änderungen von einer anderen Datei in einem anderen Zweig zu übertragen. – Tobias

Verwandte Themen