2010-04-21 22 views
8

Beim Ändern der VCS für mein Projekt FakeItEasy von SVN zu Mercurial auf Google Code war ich ein bisschen zu eifrig (ich bin lustig so). Was ich getan habe, war nur die letzte Version von SVN zu überprüfen und dann diesen Checkout als erste Revision des neuen Mercurial-Repo zu verwenden. Dies hat offensichtlich zur Folge, dass die gesamte Geschichte verloren geht.Hinzufügen von Änderungen von einem Mercurial-Repository zu einem anderen

Später, als ich ein bisschen besser zu Mercurial gewöhnt bin, erkannte ich, dass es so etwas wie eine "Convert Extension" gibt, die es Ihnen ermöglicht, ein SVN Repo in ein Mercurial Repo umzuwandeln. Nun, was ich tun möchte, ist das alte SVN Repo zu konvertieren und dann alle Änderungssätze von der derzeit vorhandenen Mercurial Repo in diesem konvertierten Repo mit Ausnahme der die erste Commit zu Mercurial.

Ich habe den SVN Repo in einen lokalen Mercurial Repo umgewandelt, aber jetzt ist, wenn ich feststecke. Ich dachte, ich wäre in der Lage, die Convert-Erweiterung zu verwenden, um das aktuelle Mercurial-Repository in das konvertierte zu bringen und eine Spleiß-Map zu entfernen, um das erste Commit zu entfernen, aber ich kann nicht scheinen, dass dies funktioniert.

Ich habe auch versucht, nur ohne Spleiß Map zu konvertieren, um alle Änderungssätze aus dem aktuellen Mercurial Repo in den konvertierten und die Rebase die zweite Version in der aktuellen zu dem letzten Commit aus dem alten SVN-Repository, aber ich Das kann auch nicht funktionieren.

Um dies deutlicher machen können sagen, ich habe diese beiden Repositories:

A: revA1-revA2 
B: revB1-revB2-revB3 (Where revB1 is actually a copy of revA2) 

Jetzt möchte ich diese beiden in das neue Repository kombinieren, um diese enthalten: So lange

C: revA1-revA2-revB2-revB3 

Antwort

11

wie du bist Ändern Sie die Hashes auf die neuen Revisionen (Sie sind), können Sie auch nur export und import (oder die transplant Befehl, der ein Wrapper um die beiden ist) verwenden.

Sie haben bereits Ihre convert, was toll ist, gehen jetzt in Repo-B und zu tun:.

hg export -o 'changeset-%R.patch' 1:tip 

, die eine changeset schaffen - ##-Patch für jeden changeset in Repo-B, mit Ausnahme des ersten (nummerierte Null).

Nun zu Repo C gehen und sie importieren:

hg import $(ls *.patch | sort -V) 

dass alle gelten sollte sauber, wenn in der Tat die revA2 und revB1 identisch waren.

+0

Das funktioniert perfekt außer eine Sache. Ich kann nicht scheinen, dass der Import mit der Wildcard funktioniert, also musste ich für jede Patch-Datei einen Import machen, aber ich musste es nur einmal machen. Vielen Dank! –

+1

Ja, die Platzhalterkarte würde nur auf Unix funktionieren, wo Ihre Shell Glob Expansion durchführt. Unter Windows benötigt jede Anwendung diese Logik. Wenn Sie also Windows verwenden, benötigen Sie eine FOR-Schleife oder führen Sie jede wie gewohnt aus. Froh, dass es funktioniert hat. –

+0

Aus einem einfachen Grund funktioniert es unter Linux möglicherweise auch nicht: Changesets werden mit einer variablen Anzahl von Ziffern nummeriert (zB 1,2,3, ..., 10,11, ... 100,101, usw.), was 'verursacht changeset-10.patch' wird vor 'changeset-2.patch' gemäß der normalen Shell-Erweiterung importiert. Sie sollten sie sortieren: 'hg import $ (ls * .patch | sort -V)' –

0

Sie in Änderungen von einem nicht verwandten Repository mit "hg Pull --force" ziehen können

Hier ist ein einfaches Anwendungsbeispiel ist:

den Test Verzeichnisse einrichten

C:\temp>mkdir hgtest 
C:\temp>cd hgtest 
C:\temp\hgtest>mkdir a 
C:\temp\hgtest>mkdir b 
C:\temp\hgtest>mkdir c 

make-Repository a

C:\temp\hgtest>cd a 
C:\temp\hgtest\a>hg init 
C:\temp\hgtest\a>echo line one >> file.txt 
C:\temp\hgtest\a>hg add file.txt 
C:\temp\hgtest\a>hg ci -m "check in one" 
C:\temp\hgtest\a>echo line two >> file.txt 
C:\temp\hgtest\a>hg ci -m "check in two" 
C:\temp\hgtest\a>echo line three >> file.txt 
C:\temp\hgtest\a>hg ci -m "check in three" 

make Repository

C:\temp\hgtest\a>cd ..\b 
C:\temp\hgtest\b>copy ..\a\file.txt file.txt 
C:\temp\hgtest\b>hg init 
C:\temp\hgtest\b>hg add file.txt 
C:\temp\hgtest\b>hg ci -m "check in b one" 
C:\temp\hgtest\b>echo line four >> file.txt 
C:\temp\hgtest\b>hg ci -m "check in b two" 
C:\temp\hgtest\b>echo line five >> file.txt 
C:\temp\hgtest\b>hg ci -m "check in b three" 

make Repository c als erstes ein Klon von a, zieht dann in den Veränderungen von b

C:\temp\hgtest\b>cd ..\c 
C:\temp\hgtest\c>hg clone C:\temp\hgtest\a . 
C:\temp\hgtest\c>hg pull --force C:\temp\hgtest\b 
C:\temp\hgtest\c>hg merge 
C:\temp\hgtest\c>hg ci -m "check in c one" 
+0

Ja, das Problem mit diesem ist, dass ich das erste Commit in Repository B erhalten, das ich nicht will . Es sei denn, ich übersehe etwas. –

+0

Sie werden alle Revisionen von beiden Repositories (einschließlich des Duplikats) haben, aber es sollte ohne Konflikt zusammengeführt werden. Es hinterlässt eine etwas unordentlichere Revisionshistorie als die Export/Import-Lösung. –

Verwandte Themen