Jak przeprowadzić migrację / konwersję z SVN do Mercurial (HG) w systemie Windows


120

Szukam narzędzia do migracji kilku repozytoriów SVN do Mercurial, z historią, etykietami i tak dalej.

Używam TortoiseHg (Windows x32), więc ConvertExtensions są odrzucane. Jest trochę informacji o tym, jak wykonać ten proces na Linuksie ( hgsvn ), ale nie mam dostępnej maszyny z Linuksem.

Czy mogę używać tych skryptów Pythona w systemie Windows? Jeśli tak, czego potrzebuję, żeby to zrobić? Lub jakich innych narzędzi mogę użyć do wykonania tego procesu?

Zasadniczo, jak mogę przekonwertować projekt SVN na Mercurial?

Odpowiedzi:


93

Po prostu musiałem sam rozwiązać ten problem. Mam komputer z systemem Windows XP z oddzielnym serwerem Windows obsługującym serwer VisualSVN .

Mam też zainstalowany TortoiseHG, a także klienta wiersza poleceń CollabNet Subversion .

<Enable Convert Extension w/ Tortoise Hg 2>

Wielkie dzięki dla bgever za wskazanie w komentarzach, że dzięki TortoiseHg 2.0 włączenie rozszerzenia konwersji jest łatwiejsze niż kiedykolwiek. Jak mówi

Dzięki TortoiseHG 2.0 stało się to znacznie prostsze: uruchom Środowisko pracy TortoiseHG z menu Start. Wybierz Plik -> Ustawienia. Wybierz rozszerzenia z listy. Zaznacz pole wyboru „konwertuj” i kliknij OK. Otóż ​​to! Nie trzeba już próbować generować pliku konfiguracyjnego i przeszukiwać go w systemie plików. - bgever 11 marca o 7:56

</Enable Convert Extension w/ Tortoise Hg 2>

<Enable Convert Extension Manually>

Aby przekonwertować repozytorium z SVN na HG, wykonałem następujące kroki:

1) Otwórz C: \ Program Files \ TortoiseHg \ Mercurial.ini

EDYTOWAĆ

FYI - Tortoise Hg migrował ten plik do

  • XP lub starszy - C: \ Documents and Settings \ NAZWA UŻYTKOWNIKA \ Mercurial.ini
  • Vista lub nowsza - C: \ Users \ NAZWA UŻYTKOWNIKA \ Mercurial.ini

Ten plik będzie w większości pusty, a ty po prostu wymienisz tam, co chcesz zastąpić. Jeśli to masz, po prostu dodaj te dwie linie na samym końcu pliku:

[extensions]
convert =

2) Wyszukaj wiersz rozpoczynający się od

[rozszerzenia]

3) Poniżej zobaczysz listę słów kluczowych, zakomentowanych za pomocą średnika (;) w każdym wierszu

4) Znajdź linię, która mówi

; konwertować =

i usuń średnik, aby brzmiał

konwertować =

</Enable Convert Extension Manually>

5) Otwórz wiersz polecenia i przejdź do katalogu, w którym chcesz utworzyć nowy folder hg (proces utworzy nowy folder o nazwie yoursvnreponame-hg w katalogu, w którym jest otwarty wiersz polecenia).

6) Użyj tego polecenia

hg konwertuj plik: /// y: / yoursvnreponame

Odkryłem, że narzędzie do konwersji może mieć problemy z repozytoriami sieciowymi, więc musiałem zmapować do niego dysk, ale to zadziałało dobrze dla mnie.


Wybór odpowiedzi na to pytanie był trudny. evilbloodydemon miał rację, kiedy skomentował w swojej odpowiedzi, aby edytować konfigurację, aby włączyć rozszerzenie konwersji, ale ta odpowiedź jest bardziej jasna i precyzyjna
David Lay

1
Chciałem tylko wspomnieć, że przetestowałem to bez klienta wiersza poleceń SVN i również zadziałało. Nie potrzebujesz nawet działającego serwera SVN, wystarczy mieć dostęp do ścieżki pliku repozytorium.
Michael La Voie

To działało dobrze dla mnie z Mercurial V1.4.3. 1-letnie repozytorium svn zostało bardzo szybko przekonwertowane z zachowaniem pełnej historii. Wielkie dzięki!
Jonathan Webb,

1
Wystarczy dodać - plik ini nie jest tworzony w domyślnej instalacji TortoiseHG. Musisz najpierw zastosować / zapisać niektóre ustawienia lub zacząć od pustego pliku, jeśli wiesz, co robisz.
Ahmad

9
Dzięki TortoiseHG 2.0 stało się to znacznie prostsze: uruchom Środowisko pracy TortoiseHG z menu Start. Wybierz Plik -> Ustawienia. Wybierz rozszerzenia z listy. Zaznacz pole wyboru „konwertuj” i kliknij OK. Otóż ​​to! Nie trzeba już próbować generować pliku konfiguracyjnego i przeszukiwać go w systemie plików.
Bart Verkoeijen

8
  1. Uruchomienie serwera SVN na hoście lokalnym
  2. hg konwertuj svn: // localhost / your_repo
  3. gotowe, ponieważ wiązania svn potrzebne tylko dla protokołu file: //

Nie, ani rtęciowe pliki binarne dla win32, ani TortoiseHg nie są dostarczane z rozszerzeniami konwersji, więc „hg convert” nie jest nawet prawidłowym poleceniem na win32.
David Lay

1
Próbowałem użyć svn: // zamiast file: //, ale ciągle pyta o powiązania Pythona
fglez

Użycie svn: // zamiast file: // działało dla mnie bez powiązań Pythona. Aby uruchomić serwer svn, polecenie brzmi: svnserve -r <ścieżka do katalogu głównego repozytorium> -d
Petter Wigle

7

Mercurial ma do tego wbudowane rozszerzenie konwersji .


2
Wiem, to pierwsza rzecz, na którą się natknąłem, ale cytując: „Zauważ, że nie możesz tego zrobić z plikami binarnymi Win32 Mercurial - nie ma sposobu na zainstalowanie powiązań Subversion we wbudowanej bibliotece Pythona”. TortoiseHg ...
David Lay

Używasz Live CD Linux lub maszyny wirtualnej?
Richq

To jest absolutnie poprawna odpowiedź. Zrobiłem to używając tylko rozszerzenia hg convert ( selenic.com/mercurial/wiki/ ... ) i protokołu plików dla repozytorium SVN bez rozszerzenia pysvn: hg konwertuj plik: /// X: / HOME / REPOS / mysvnrep newhgrep
van

5

Aby przekonwertować SVN Repo na HG Repo ORAZ skopiować je na inny serwer, będziesz potrzebować kilku rzeczy.

  1. Zainstalowano TortoiseHG. (Sprawdź, która wersja jest aktualnie używana)
  2. Zainstalowany Python. (Sprawdź, która wersja jest aktualnie używana)
  3. Moduły Pythona (można je znaleźć http://pysvn.tigris.org/project_downloads.html )
  4. Będziesz musiał dodać convertrozszerzenie do Tortoise. Uruchom Środowisko pracy TortoiseHG z menu Start. Wybierz File -> Settings. Wybierz Extensionsz listy. Zaznacz pole convertwyboru i kliknij OK.

Najpierw konwersja…

  1. Najlepiej jest zmapować folder, w którym znajduje się bieżące repozytorium SVN, na komputer, na którym pracujesz. (tj. \\server\folder nie mapuj samego folderu SVN Repo. Mapuj folder tuż nad nim) Nadaj zmapowanemu dyskowi literę, na przykładY:\
  2. Otwórz wiersz polecenia i wpisz: CD /D Y:\
  3. Po Y:\znaku zachęty wpisz: hg convert y:/RepoName (użyj nazwy bieżącego repozytorium) Uważaj na ukośniki w przód iw tył. Ten w poleceniu to ukośnik. Ponadto, jeśli nazwa zawiera spacje, umieść ją w cudzysłowie. (tj. Y:/"My Repo folder")
  4. Teraz powinien być uruchomiony i utworzy inny folder obok starego. Wewnątrz powinien znajdować się folder HG. NIE BĘDZIE INICJOWANY I NIE WŁĄCZAJ!
  5. Konwersja jest zakończona.

Po drugie klonowanie…

  1. Otwórz Środowisko pracy TortoiseHG. Iść doFile -> Clone Repository
  2. Źródło: wprowadź pełną ścieżkę przekonwertowanego repozytorium.
  3. Miejsce docelowe: wprowadź pełną ścieżkę do miejsca, w którym chcesz sklonować repozytorium. Nie jest konieczne tworzenie folderu w nowym miejscu docelowym, ponieważ proces klonowania utworzy go i zainicjuje.
  4. Dodaj uprawnienia do nowego sklonowanego folderu.
  5. Jesteś skończony!!!

Cześć, czy można wyjaśnić, dlaczego nie powinieneś mieć initpierwszego repozytorium?
Ben Page

3

Nikt nadal nie wspomina o hgsubversion ( Extension Wiki ), który może to zrobić bez prawie żadnego bólu głowy (z wyjątkiem rzadkich przypadków i konkretnego drzewa).

Po prostu dodaj rozszerzenie, włącz je i hg clone SVN_REPOdo lokalnego repozytorium Mercurial


1

To jest w FAQ TortoiseHg :

Jak mogę przekonwertować repozytorium subversion do Mercurial?

Musisz zainstalować narzędzia wiersza poleceń svn-win32-1.4.6, a następnie dodać je do swojej ścieżki. Następnie musisz włączyć rozszerzenie konwersji. W tym momencie powinieneś móc użyć polecenia „ hg convert”, aby wykonać konwersję. Prosimy o kierowanie problemów / pytań dotyczących rozszerzenia konwersji na listę mailingową Mercurial lub #mercurialna irc.freenode.net.

Więc jest to najwyraźniej możliwe - używam Linuksa, więc sam nie próbowałem.


0

Właśnie przekonwertowałem zdalne repozytorium SVN z uwierzytelnianiem HTTP na repozytorium Mercurial i powiem ci, że nie ma zbyt wielu dokumentacji, jak to zrobić. Musiałem pobrać źródło Mercurial i zainstalować je samodzielnie, używając pakietu źródłowego, aby wiązania SVN działały prawidłowo.

Zainstalowałem to tak:

python setup.py install

Co działało dobrze na moim serwerze Server 2003. Mogę teraz przekonwertować repozytorium SVN we właściwy sposób, wykonując coś takiego:

python c:\python26\scripts\hg convert <remote repo>

Dokumentacja ConvertExtension na stronie Mercurial nie jest zbyt jasna, ale mówi tak:

Nie ma możliwości zainstalowania powiązań Subversion we wbudowanej bibliotece Pythona [Mercurial]. Musisz więc użyć Mercurial zainstalowanego na samodzielnym Pythonie

Więc teraz używam wersji samodzielnej do konwersji i TortoiseHg do rzeczywistej pracy VCS.


0

lepiej późno niż wcale ...

Dwie odpowiedzi w cenie jednej ...

  1. Jeśli jest to publiczne repozytorium o otwartym kodzie źródłowym, możesz po prostu użyć http://svn2github.com/add/, co zajęło około pół godziny, aby sklonować to repozytorium do GitHib, a następnie po prostu przeciągnąć to do Hg.

  2. Zaletą używania hg convertjest to, że można go wznowić. Konwersja SVN na Hg może zająć kilka dni . Jeśli to zatrzymasz, zostanie wznowione od miejsca, w którym zostało przerwane.

Poniżej znajduje się plik wsadowy, który napisałem, ponieważ Codeplex SVNbridge śmieci. Repozytorium w tym przykładzie zajęło kilka dni, aby pobrać całą historię (jestem w Australii, więc opóźnienie mogło być czynnikiem). Chciałbym pomyśleć, że dał gdzieś serwer TFS dobre bicie.

Ten plik wsadowy można uruchomić w dowolnym momencie, aby pobrać aktualizacje ze źródła SVN, jeśli są jedynymi na świecie, które nadal używają SVN. Nie testowałem tego, więc zobacz, co się stanie, jeśli to zrobisz, więc na twoim miejscu porzuciłbym oryginalną gałąź, jeśli zamierzasz edytować repozytorium.

Chodzi o robocopy shamapto, aby zachować historię SVN, jeśli sklonujesz repozytorium Hg, shamap jest efemeryczny - sprawdź plik wsadowy i shamap (zrobiłbym to na nowej gałęzi).

partia ...

@echo off
mode con:cols=100 lines=800

:: Change the SVN remote name here
::
set remote=https://cinch.svn.codeplex.com/svn
::

title Fetching SVN from %remote%. This could take...DAYS
echo .
echo Fetching SVN checkins from %remote%
echo .
echo Dependencies: Tortoise Hg and hg.exe in the Path would be ideal.
echo using hg convert
echo .
echo First, I will make a backup of shamap in the hg repo folder.
echo If shamap in .hg\ is newer then it will be copied to the repo.
echo You should commit it so hg clones of this repo work with this.
echo Commit this .BeeyATch file as well.
echo shamap keeps track of what has been fetched from SVN.
echo ok, that ends the educational part of this script...
echo Now I will fetch SVN changes from
echo %remote%
echo ...
echo ...(this could take quite some time)...
echo ...DAYS...yes...DAYS
echo ...especially if it's fecking Codeplex SVN...
echo .
echo If this craps out just run it again - it will resume from where it left off. 
echo and fetch the rest...eventually
echo .
echo Control C to abort or any other key to start:
echo .

pause

echo .
:: http://mercurial.selenic.com/wiki/ConvertExtension <== see for details of shamap
:: copy the shamap from the original convert into the .hg folder unless it is already there & newer
:: don't panic if shamap is much bigger than the original - diff it to see why
robocopy .\ .\.hg\ shamap /XO 
robocopy .\.hg\ .\ shamap /XO 
echo .

hg convert --verbose --debug %remote% "%CD%"
echo .
echo .
echo Finished fetching from %remote%
title Finished fetching from %remote%
echo Any  key to Exit
echo .
pause

exit

0

Korzystanie z convertrozszerzenia Mercurial:

  1. Włącz rozszerzenie konwersji; dodaj convert=do [extensions]sekcji .hgrc w ten sposób:

    [rozszerzenia]
    convert =

  2. Linux potrzebuje dodatkowych powiązań Pythona: sudo apt-get install python-subversion
  3. Wykonaj hg convertpolecenie
    • Zobacz, hg convert -haby uzyskać pomoc
    • Przykład: hg convert http://[svnserver]/[Project] --source-type svn [DestinationDir] (patrz uwaga 2)
  4. Wypchnij do nowo utworzonego repozytorium Mercurial: hg push https://[mercurialserver]/[Project]

uwaga : możesz nawet powtórzyć polecenie hg convert, aby uwzględnić nowe zmiany wprowadzone w repozytorium svn po poprzedniej konwersji.

uwaga 2 : Kiedy hg convert nie działa przy użyciu http://lub svn://możesz najpierw pobrać repozytorium Subversion (lub zaktualizować istniejące) i przekonwertować używając lokalnego pobierania; przykład:hg convert [DirectoryOfLocalCheckout] --source-type svn [DestinationDir]

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.