2009-10-18 19 views
15

Jestem całkiem nowy w git i próbuję przenieść repozytorium svn do git. I przestrzegać instrukcji poniżej więc teraz mam repo git na moim serwerze
http://pauldowman.com/2008/07/26/how-to-convert-from-subversion-to-git/Konwersja svn na git, jak sprawić, by gałęzie nie były po prostu odległe w repozytorium svn?

Więc, jeśli mam zrobić „git git oddział” odpowiedzi „* master” i jeśli to zrobię „git oddziału -r” Dostaję lista wszystkich gałęzi w repozytorium svn.

Moje ostatnie svn-checkiny były w jednym z oddziałów, ale kiedy zrobiłem "git svn clone" - moje zeznania w tej gałęzi (nie zostały jeszcze połączone w pień) są widoczne w moim (git) master branch. Czego tu mi brakuje?

Ponadto, jeśli na mojej maszynie programistycznej zrobię "git clone", pliki są w porządku. Ale jeśli zrobię "git branch -r", zobaczę tylko główny oddział, a nie odległe oddziały. "

Ponieważ pozbieramy svn-repo razem, chciałbym mieć wszystkie gałęzie svn w git-repo, tak, że można uzyskać do nich dostęp od deweloperów:

Ponownie, nie jestem totalną nowicjuszką, ale nie daleko od niej. Więc jeśli jest coś fundamentalnego, czego tu brakuje, proszę, powiedz mi .

Aktualizacja
Po jakiejś RTFM (man git-svn) I rozwiązać pierwszy problem z oddziału rzeczy obecny w branży nadrzędnego

zresetowane --hard piloty/trunk

Teraz pnia i gałęzi mistrz są takie same. Teraz należy dowiedzieć się, jak zdobyć gałęzie od klientów programistycznych.

Aktualizacja 2
mam to działa poprzez łączenie URL powyżej url że Scott wskazał. Tak więc od samego początku.

raz pierwszy stworzony pusty repozytorium na serwerze, są one przechowywane w katalogu/usr/local/git-repo na naszym serwerze:

server> cd /usr/local/git-repos 
server> mkdir my_project.git 
server> cd my_project.git 
server> git init 

potem sklonowany z SVN-repozytorium do mojego dev-maszyny (zauważ, że na naszym serwerze svn z „gałęzie” reż nazywa się „oddział” witout imienia „s”):

dev> git svn clone http://<svn.server>/my_project --no-metadata -A authors.txt -t tags -b branch -T trunk my_project 

Wtedy niektórzy clean-up, aby uzyskać tagi i oddziałów w kolejności:

dev> cp -Rf .git/refs/remotes/tags/* .git/refs/tags/ 
dev> rm -Rf .git/refs/remotes/tags 
dev> cp -Rf .git/refs/remotes/* .git/refs/heads/ 
dev> rm -Rf .git/refs/remotes 

Teraz dodać swój serwer jako zdalnego repozytorium:

dev> git remote add origin [email protected]<our_server>:/usr/local/git-repos/my_project.git 

wreszcie wcisnąć wszystkie branże i tagi do serwera:

dev> git push origin --all 

Uff, teraz masz to teraz ja można się pozbyć tego svn-repo.

Update 3
Zamówienie ebneters post poniżej łatwiejszy sposób to robi ...

Odpowiedz

14

Istnieje dość szczegółowe wyjaśnienie, w jaki sposób to zrobić całkiem dobry import SVN, który wyjaśnia, jak przerobić gałęzie prawidłowo tutaj:

https://git-scm.com/book/en/v1/Git-and-Other-Systems-Migrating-to-Git

odpowiedź jest krótka, aby uruchomić to:

$ cp -Rf .git/refs/remotes/* .git/refs/heads/ 
$ rm -Rf .git/refs/remotes 

Mam nadzieję, że to pomocne.

+0

Użyłem tej metody na lustrze git z serwera svn, z którego ciągle ściągam, a to jakoś łamie historię. Czy to jest oczekiwane, czy robię coś złego. – Doppelganger

8

Innym dobrym sposobem na zrobienie tego, tylko dla przypomnienia, jest użycie svn2git - Jestem w trakcie konwersji kilku raczej dużych repozytoriów i był to dar niebios. Automatyzuje wszystkie kroki potrzebne do dbania o gałęzie i konwertowania tagów svn do rzeczywistych tagów git.

+0

Ah, to zaoszczędziłoby mi dużo pracy. Ale hej, przynajmniej wiem więcej o git teraz niż wcześniej ...:) –

5

Rozwiązanie Scotta nie działa dla mnie. Podejrzewam, że coś mogło się zmienić w najnowszej wersji git-svn, odkąd to opublikował (i od kiedy została napisana powiązana książka), ponieważ agresywnie zbiera śmieci, gdy tylko klon się zakończy. Ale to tylko przypuszczenie, dlaczego nie zadziałało. Używam git 1.6.5.6.

W szczególności mój katalog .git/refs/remote był całkowicie pusty, z wyjątkiem katalogu tagów, który również był pusty. Więc nie mogę nic skopiować, żeby to naprawić.

Po niektóre wywiercenie, udało mi się rozwiązać ten problem poprzez sprawdzenie pliku .git/upakowane bibl i robi wyszukiwania i zamiany w następnym (w tej kolejności):

refs/remotes/tags => refs/tags 
refs/remotes => refs/heads 

Jeśli twój edytor jest vim, można to zrobić z tych dwóch komend:

:%s/refs\/remotes\/tags/refs\/tags/g 
:%s/refs\/remotes/refs\/heads/g 

svn2git 1.3.1 również nie przyniosły rezultatu użytkowej dla mnie (w pewnym momencie nie importować żadnych popełni kilka miesięcy temu, a gałęzie wszystko pokazał te same zatwierdzenia). Na razie zrezygnowałem z svn2git i odniosłem największy sukces używając git-svn w połączeniu z powyższym.

Myślenie życzeniowe: na pewno byłoby dobrze, gdyby git-svn dodał po prostu polecenie takie jak "porzuć" lub "przenieś", które automatyzowałoby ten proces w przyszłościowy sposób.

1

Migrowałem 2 repv svn do git (git version 1.7.0.4) zgodnie z recepturą Scotta, mniejszą i większą. Ten mniejszy zachowywał się jak opisał Scott w rozdziale książki. Większy wymagał rozwiązania Davida. Inną rzeczą jest to, że

$ git push origin --all 

nie naciskać żadnych tagów i zamiast musiałem to zrobić:

$ git push origin --all 
$ git push origin --tags 

To może nie być oczywiste z flagą --all iz rozdziału książki i I zrealizowałem to po usunięciu lokalnego repozytorium git svn.

Powiązane problemy