2010-11-30 3 views
6

Ich habe ein großes Commit von vielen Dateien in einem Zweig, ich muss die Änderungen einer einzelnen Datei in diesem Änderungssatz in einen anderen Zweig übertragen. Wie kann ich das machen? Ich benutze hauptsächlich TortoiseHg, aber Kommandozeilen-Lösungen sind auch in Ordnung.Wie kann ich in Mercurial die Änderungen einer einzelnen Datei aus einem Changeset extrahieren, um sie auf einen anderen Zweig anzuwenden?

Wenn ich zu dem Änderungssatz in TortoiseHg gehe und die Datei auswähle, kann ich die Diffs sehen, die ich übertragen möchte, aber keine Möglichkeit, sie tatsächlich anzuwenden.

Antwort

8

Sie können den Patch erhalten nur für diese Datei:

hg log -r THEREVISIONWITHLOTSOFCHANGES -p -I path/to/justthatfile > justthatfile.patch 

, die Sie dann auf jedem beliebigen Zweig Sie, indem Sie möchten importieren:

hg update anotherbranch 
hg import --no-commit justthatfile.patch 
hg commit 
2

Die einfachste Lösung ist, den Patch der Datei zu entleeren, um es in der aktuellen Arbeits Revision gilt, und verpflichten sie (vorausgesetzt, Sie an der Wurzel des Repositorys sind):

$ hg up <revision-to-apply-the-patch-to> 
$ hg diff -c <revision-containing-the-patch> <files-to-include> | patch -p0 
$ hg ci -m "Transplanting selected changes from <revision-contain...>" 

Der Nachteil dieser Methode ist, dass es nicht sehr offensichtlich ist, was Sie aus einer Revisionshistorie Perspektive getan haben. Eine gute Commit-Nachricht hilft hier, aber das Verlaufsdiagramm gibt keinen Hinweis auf den Prozess der Übertragung einiger Änderungen. In diesem Fall Verschmelzen und Umkehr- kann eine bessere Lösung:

$ hg up <revision-to-apply-the-patch-to> 
$ hg merge -r <revision-containing-the-patch> 
$ hg revert --no-backup <files-to-exclude> 
$ hg ci -m "Merge in changes of <files-to-include>" 

Wahrscheinlich gibt es mehr Lösungen, dies zu tun - diese beiden ersten mir einfiel.

Verwandte Themen