2012-04-04 15 views
8

Tak, wiem. Dlaczego chcesz przeprowadzić migrację z Git na SVN?Migracja Git-2-SVN?

Cóż, zdarza się, że muszę przeprowadzić migrację ogromnego repozytorium Git do Subversion! Oto jeden obieg Próbowałem na komentarz Edwina:

najpierw utworzyć lokalnego repo SVN: svnadmin create svn_repo

Następny sprawdzić mój Git repo: git clone git:myNameSpace/myProject

cd do myProject i uruchom:

git svn init -s --prefix=svn/ file:///home/myHome/svn_repo/myProject

git svn fetch

git rev-list --parents master | grep '^.\{40\}$' wyszukać hasz zatwierdzenia root i daje tylko jeden commit tak, jak powinien.

Następny jest, aby skrót pustego pnia popełnić: git rev-parse svn/trunk

Ten niestety nie powiedzie się z:

fatal: ambiguous argument 'svn/trunk': unknown revision or path not in the working tree. Use '--' to separate paths from revisions

No nie mogę pójść znacznie po tym ....

+5

Jest dużo marketingu (i kilka dobrych powodów) faworyzować Git nad Subversion, ale istnieje wiele bardzo dobrych powodów, aby sprzyjać Subversion ponad Git też. Na myśl przychodzi na myśl obsługa dużych plików (z jednego powodu). –

+0

Oczywiście, uwielbiam Git i faworyzuję go w Subversion w rytmie serca ... ale i tak muszę przeprowadzić tę migrację ... –

+0

Właściwie to wolę subwersję niż git, ale to ma więcej wspólnego z moją znajomością i narzędziem wiedza integracyjna z subwersją. Ma niewiele wspólnego z zestawem funkcji gita. –

Odpowiedz

8

Polecam migrację z SubGit w kilku prostych krokach.

$ svnadmin create svn.repo 
$ subgit configure svn.repo 
$ nano svn.repo/conf/subgit.conf #edit path to your (bare!) Git repository (you may use "git clone --bare <URL> bare.git.repo" if you don't have it locally) 
$ subgit install 

To wszystko. Podczas tłumaczenia SubGit będzie próbował zachować wszystkie zatwierdzenia (nawet tymczasowe), rozgałęzia, scala, ignoruje, daty, ustawienia EOL, tagi i tak dalej, jak to tylko możliwe.

Po przetłumaczeniu repozytoria będą zsynchronizowane (każde naciśnięcie przycisku Git jest tłumaczone na wersję SVN i na odwrót). Aby przełamać synchronizacji (jeśli nie jest to potrzebne) prowadzony

$ subgit uninstall svn.repo 
+1

Należy zauważyć, że SubGit wymaga konfiguracji po stronie serwera (tj. Pliku "svn.repo/conf/subgit.conf"), więc nie ma sensu, jeśli nie masz dostępu do samego serwera. – Siggen

+1

Od 2.0 można zrobić to samo ze zdalnym repozytorium za pomocą 'subgit configure --svn-url

'. Lub alternatywnie (w lepszy sposób, jeśli pozwala na to hak przedrewolucyjny) można skonwertować lokalnie repozytorium i przesłać je za pomocą 'svnsync' lub' svndump + svnrdump'. –

+0

Czy SubGit wymaże całą historię SVN, czy tylko stworzy dodatkowe wersje oparte na zatwierdzeniu git? – igorsantos07

3

--- Edytowane po dodaniu szczegółów ---

Zrobiłeś pustą początkową com z mitem do svn/trunk? Jeśli nie, to wytłumaczyłoby, dlaczego dostałeś błąd, którego nie można znaleźć w historii.

Uwagi (w połączeniu)

The --prefix gives you remote tracking branches like "svn/trunk" which 
is nice because you don't get ambiguous names if you call your local 
branch just "trunk" then. 

i

Then get the hash of the empty trunk commit: 

tendencję do zrozumienia, że ​​zrobili svn/trunk zobowiązać się do zapobiegania konfliktom svn z istniejącymi wcześniej trunk katalogu. Jeśli tak jest, być może Twoim jedynym błędem nie jest zobowiązanie się do znalezienia późniejszego kodu?

--- Original post następująco ---

Czy próbowałeś this? dcommit nie będzie działał poprawnie, dopóki nie zlinearyzujesz historii swojego pnia (lub gałęzi).

Poinformuj o swoich próbach migracji. Chociaż to, co napisałeś, jest użytecznym komunikatem o błędzie, byłoby dziesięć razy bardziej użyteczne z listą kroków użytych do uzyskania tego błędu.

+0

'git svn fetch' kończy się niepowodzeniem z: W: Zignorowanie błędu z SVN, ścieżka prawdopodobnie nie exist: (160013): System plików nie ma elementu: Plik nie znaleziony: wersja 1, ścieżka '/ gentkt' W: Nie przejmuj się powyższym komunikatem git-svn po prostu agresywnie szuka starej historii. Może to chwilę potrwać na dużych repozytoriach –

+0

, a następnie 'git rev-parse svn/trunk' daje: svn/trunk fatal: niejednoznaczny argument 'svn/trunk': nieznana wersja lub ścieżka nie znajdująca się w drzewie roboczym. Użyj "-" do oddzielenia ścieżek od wersji –

+0

Edwin, zaktualizowałem opublikowane pytanie i kroki, które podjąłem w twoim linku. Dziękuję za pomoc i daj mi znać, jeśli mógłbym więcej. –