2010-04-21 17 views
8

Podczas zmiany VCS dla mojego projektu FakeItEasy z SVN na Mercurial na Google Code byłem trochę zbyt chętny (jestem taki zabawny). To, co zrobiłem, to sprawdzenie najnowszej wersji z SVN, a następnie zatwierdzenie tej transakcji jako pierwszej rewizji nowego repozytorium Mercurial. To oczywiście ma wpływ na utratę całej historii.Dodawanie zmian z jednego repozytorium Mercurial do innego

Później, gdy nieco lepiej przyzwyczaiłem się do Mercurial, zdałem sobie sprawę, że istnieje coś takiego jak "rozszerzenie konwersji", które pozwala konwertować repozytorium SVN na repozytorium Mercurial. Teraz chciałbym przekonwertować stare repozytorium SVN, a następnie wszystkie zestawy zmian z aktualnie istniejącego repozytorium Mercurial zaimportowane do tego przekonwertowanego repo z wyjątkiem pierwszego zatwierdzenia do Mercurial.

Przekształciłem repozytorium SVN na repozytorium Mercurial, ale teraz jest, kiedy utknąłem. Pomyślałem, że będę mógł użyć rozszerzenia konwertującego, aby przenieść bieżące repozytorium Mercurial do przekonwertowanego i mieć mapę splicingu usunąć pierwsze zatwierdzenie, ale nie mogę sprawić, żeby to działało.

Próbowałem również użyć konwersji bez mapy splotów, aby uzyskać wszystkie zestawy zmian z bieżącego repozytorium Mercurial w przekonwertowane, a rebase drugą wersję w bieżącym do ostatniego zatwierdzenia ze starego repozytorium SVN, ale ja nie mogę tego również użyć.

Aby to wyraźniej powiedzmy mam te dwa repozytoria:

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

Teraz chcę połączyć te dwa do nowego repozytorium zawierające ten:

C: revA1-revA2-revB2-revB3 

Odpowiedz

11

Dopóki jesteś zmieniając skróty w nowych wersjach (jesteś), możesz równie dobrze użyć polecenia export i import (lub polecenia transplant, które jest opakowaniem wokół dwóch).

Już nie Twój konwertyta, który jest wielki, teraz przejść do repo B i zrobić.

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

że stworzy changeset - ## poprawkę dla każdego changeset w repo B, z wyjątkiem pierwszego (numerowane zero).

Teraz przejdź do repo C i importować je:

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

To powinno wszystko zaaplikowana jeśli rzeczywiście revA2 i revB1 były identyczne.

+0

Działa to doskonale z wyjątkiem jednej rzeczy. Nie mogę sprawić, by import działał z dziką kartą, więc musiałem zrobić jeden import dla każdego pliku łaty, ale musiałem zrobić to tylko raz. Dzięki! –

+1

Tak, dzika karta działałaby tylko na Uniksie, gdzie twoja powłoka rozwija się globalnie. W oknach każda aplikacja potrzebuje tej logiki, więc jeśli jesteś w systemie Windows, potrzebujesz pętli FOR lub po prostu uruchom każdą z nich tak jak Ty. Cieszę się, że to działało. –

+0

Może również nie działać z Linuksem z prostego powodu: zestawy zmian są numerowane przy użyciu zmiennej liczby cyfr (np. 1,2,3, ..., 10,11, ... 100,101, itp.), Powodując ' changeset-10.patch' do zaimportowania przed 'changeset-2.patch' zgodnie z normalnym rozszerzeniem powłoki. Powinieneś je posortować: 'hg import $ (ls * .patch | sort -V)' –

0

Można wyciągnąć zmiany od niezwiązanego z repozytorium „hg ciągnącej --force”

Oto prosty przykład użycia:

skonfigurować katalogi testowych

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

make repozytorium 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" 

utworzyć repozytorium b

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 repozytorium c jako pierwszy klonem, a następnie pociągnąć w zmianach z 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

Tak, problem polega na tym, że dostaję pierwsze zatwierdzenie do repozytorium B, którego nie chcę . Chyba że coś przeoczyłem. –

+0

Będziesz mieć wszystkie wersje z obu repozytoriów (w tym duplikatu), ale powinny one łączyć się bez konfliktów. Pozostawia nieco bardziej zawikłaną historię wersji niż rozwiązanie eksportu/importu. –

Powiązane problemy