Jak przenieść repozytorium SVN z historią do nowego repozytorium Git?
Czytam Podręcznik Git, FAQ, Git-SVN crash course, itp. i wszystkie one wyjaśniają to i tamto, ale nigdzie nie znajdziesz prostej instrukcji takiej jak:
Repozytorium SVN w: svn://myserver/path/to/svn/repos
Git repozytorium w: git://myserver/path/to/git/repos
git-do-the-magic-svn-import-with-history \
svn://myserver/path/to/svn/repos \
git://myserver/path/to/git/repos
Nie oczekuję, że to będzie takie proste i nie oczekuję, że będzie to pojedyncze polecenie. Oczekuję jednak, że nie będzie to próbowało niczego wyjaśniać - po prostu powiedzieć, jakie kroki podjąć na tym przykładzie.
30 answers
Magia:
$ git svn clone http://svn/repo/here/trunk
Git i SVN działają zupełnie inaczej. Musisz nauczyć się Gita, a jeśli chcesz śledzić zmiany Z SVN pod prąd, musisz nauczyć się git-svn
. Strona podręcznika git-svn
zawiera sekcję dobrych przykładów:
$ git svn --help
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-16 15:42:39
Tworzenie pliku users (np. users.txt
) do mapowania użytkowników SVN do Git:
user1 = First Last Name <[email protected]>
user2 = First Last Name <[email protected]>
...
Możesz użyć tej jednowierszowej do zbudowania szablonu z istniejącego repozytorium SVN:]}
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > users.txt
SVN zatrzyma się, jeśli znajdzie brakującego użytkownika SVN Nie w pliku. Ale potem możesz zaktualizować plik i rozpocząć od miejsca, w którym skończyłeś.
Teraz wyciągnij dane SVN z repozytorium:
git svn clone --stdlayout --no-metadata --authors-file=users.txt svn://hostname/path dest_dir-tmp
To polecenie utworzy nowe repozytorium Git w dest_dir-tmp
i rozpocznie pobieranie repozytorium SVN. Zauważ, że flaga" --stdlayout " oznacza, że masz wspólny układ SVN "trunk/, branches/, tags/". Jeśli twój układ jest inny, zapoznaj się z --tags
, --branches
, --trunk
opcje (ogólnie git svn help
).
Wszystkie wspólne protokoły są dozwolone: svn://
, http://
, https://
. Adres URL powinien być kierowany do repozytorium bazowego, coś w stylu http://svn.mycompany.com/myrepo/repository. to musi nie zawierać /trunk
, /tag
lub /branches
.
Zauważ, że po wykonaniu tej komendy bardzo często wygląda na to, że operacja jest "zawieszona/zamrożona" i to całkiem normalne, że może zostać zablokowana przez długi czas po zainicjowaniu nowego repozytorium. W końcu zobaczysz komunikaty dziennika, które wskazują, że migruje.
Zauważ również, że jeśli pominiesz flagę --no-metadata
, Git doda informację o odpowiedniej rewizji SVN do komunikatu zatwierdzającego (np. git-svn-id: svn://svn.mycompany.com/myrepo/<branchname/trunk>@<RevisionNumber> <Repository UUID>
)
Jeśli nie znaleziono nazwy użytkownika, zaktualizuj plik users.txt
, a następnie:
cd dest_dir-tmp
git svn fetch
You might jeśli masz duży projekt, musisz powtórzyć to ostatnie polecenie kilka razy, dopóki nie zostaną pobrane wszystkie commity Subversion:
git svn fetch
Po zakończeniu, Git dokona kasowania SVN trunk
do nowej gałęzi. Wszelkie inne gałęzie są ustawione jako piloty. Możesz wyświetlić inne gałęzie SVN za pomocą:
git branch -r
Jeśli chcesz zachować w repozytorium Inne Zdalne gałęzie, Utwórz ręcznie dla każdej z nich lokalną gałąź. (Skip trunk / master.) If you don ' t do this, the gałęzie nie zostaną sklonowane w ostatnim kroku.
git checkout -b local_branch remote_branch
# It's OK if local_branch and remote_branch are the same name
Znaczniki są importowane jako gałęzie. Musisz utworzyć lokalną gałąź, utworzyć tag i usunąć gałąź, aby mieć je jako znaczniki w Git. Aby to zrobić z tagiem "v1":
git checkout -b tag_v1 remotes/tags/v1
git checkout master
git tag v1 tag_v1
git branch -D tag_v1
Sklonuj swoje repozytorium GIT-SVN do czystego repozytorium Git:]}
git clone dest_dir-tmp dest_dir
rm -rf dest_dir-tmp
cd dest_dir
Lokalne gałęzie utworzone wcześniej ze zdalnych gałęzi zostaną skopiowane do nowego sklonowanego repozytorium jako gałęzie zdalne. (Skip trunk / master.) Dla każdego oddziału chcesz zachować:
git checkout -b local_branch origin/remote_branch
Na koniec usuń zdalny z czystego repozytorium Git, które wskazuje na teraz usunięte tymczasowe repozytorium:
git remote rm origin
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-15 09:36:14
Łatwo Przenieś swoje repozytorium Subversion do repozytorium Git. Najpierw musisz utworzyć plik, który mapuje nazwy autorów zmian Subversion na commity Git, powiedzmy ~/authors.txt
:
jmaddox = Jon Maddox <[email protected]>
bigpappa = Brian Biggs <[email protected]>
Następnie możesz pobrać dane Subversion do repozytorium Git:
mkdir repo && cd repo
git svn init http://subversion/repo --no-metadata
git config svn.authorsfile ~/authors.txt
git svn fetch
Jeśli korzystasz z komputera Mac, możesz pobrać git-svn
z MacPorts, instalując git-core +svn
.
Jeśli Twoje repozytorium subversion znajduje się na tej samej maszynie co żądane repozytorium git, następnie możesz użyć tej składni do krok init, inaczej wszystko to samo:
git svn init file:///home/user/repoName --no-metadata
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-31 23:08:52
Użyłem skryptu svn2git i działa jak urok! https://github.com/nirvdrum/svn2git
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-01 07:53:50
Sugeruję zaznajomienie się z Git-em zanim spróbuje używać Git-svn w sposób ciągły, tzn. utrzymywanie SVN jako scentralizowanego repo i używanie Git lokalnie.
Jednak dla prostej migracji z całą historią, oto kilka prostych kroków:
Inicjalizacja lokalnego repo:
mkdir project
cd project
git svn init http://svn.url
Zaznacz, jak daleko chcesz zacząć importować wersje:
git svn fetch -r42
W tym przypadku nie jest to możliwe.]}
Od tego czasu pobieramy wszystko:
git svn rebase
Możesz sprawdzić wynik importu z Gitk. Nie jestem pewien, czy to działa na Windows, działa na OSX i Linux:
gitk
Kiedy twój SVN repo jest sklonowany lokalnie, możesz wysłać go do scentralizowanego Git repo dla łatwiejszej współpracy.
Najpierw Utwórz swoje puste zdalne repo (może na GitHub?):
git remote add origin [email protected]:user/project-name.git
Następnie, opcjonalnie zsynchronizuj główną gałąź, aby operacja pull automatycznie połączyła zdalny master z lokalnym master, gdy oba zawierają nowy stuff:
git config branch.master.remote origin
git config branch.master.merge refs/heads/master
Potem możesz być zainteresowany wypróbowaniem mojego własnego Narzędzia git_remote_branch
, które pomaga radzić sobie ze zdalnymi gałęziami:
Pierwszy post wyjaśniający: "Git remote branches "
Kontynuacja najnowszej wersji: "Czas na współpracę z git_remote_branch"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-18 17:00:54
Jest nowe rozwiązanie do płynnej migracji z Subversion do Git (lub do używania obu jednocześnie): SubGit ( http://subgit.com/).
Sam pracuję nad tym projektem. Używamy SubGit w naszych repozytoriach-niektórzy z moich kolegów używają Gita, a niektórzy Subversion i jak na razie działa bardzo dobrze.Aby przejść z Subversion do Git za pomocą SubGit musisz uruchomić:
$ subgit install svn_repos
...
TRANSLATION SUCCESSFUL
Potem otrzymasz repozytorium Git w svn_repos/.git i może go sklonować, lub po prostu kontynuować użyj Subversion i tego nowego repozytorium Git razem: SubGit upewni się, że oba są zawsze zsynchronizowane.
Jeśli Twoje repozytorium Subversion zawiera wiele projektów, wtedy wiele repozytoriów Git zostanie utworzonych w katalogu svn_repos / git. Aby dostosować tłumaczenie przed jego uruchomieniem, wykonaj następujące czynności:
$ subgit configure svn_repos
$ edit svn_repos/conf/subgit.conf (change mapping, add authors mapping, etc)
$ subgit install svn_repos
Z SubGit możesz migrować do czystego Git (nie git-svn) i zacząć go używać, zachowując Subversion tak długo, jak go potrzebujesz (dla Twojego już skonfigurowane narzędzia budowania, na przykład).
Mam nadzieję, że to pomoże!Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-24 20:12:41
Zobacz oficjalną stronę podręcznika git-svn . W szczególności spójrz pod "podstawowe przykłady":
Śledzenie i przyczynianie się do całego projektu zarządzanego przez Subversion (kompletna z pniem, znacznikami i gałęziami):
# Clone a repo (like git clone):
git svn clone http://svn.foo.org/project -T trunk -b branches -t tags
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-06 15:38:32
Pro Git 8.2 wyjaśnia: http://git-scm.com/book/en/Git-and-Other-Systems-Migrating-to-Git
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-17 16:19:10
SubGit (vs Blue Screen of Death)
subgit import --svn-url url://svn.serv/Bla/Bla directory/path/Local.git.Repo
To wszystko.
+ do aktualizacji z SVN, repozytorium Git utworzonego przez pierwsze polecenie.
subgit import directory/path/Local.git.Repo
Użyłem sposobu na natychmiastową migrację do Gita dla ogromnego repozytorium.
Oczywiście, że potrzebujesz przygotowania.
Ale możesz nie zatrzymać procesu rozwoju, w ogóle.
Moje rozwiązanie wygląda tak:
- migracja SVN do Gita repozytorium
- zaktualizuj repozytorium Git tuż przed przejściem zespołu do.
Migracja zajmuje dużo czasu dla dużego repozytorium SVN.
Ale aktualizacja zakończonej migracji zaledwie kilka sekund.
Oczywiście, że używam SubGit , mamo. git-svn czyni mnie niebieskim ekranem śmierci. Ciągle. A git-svn mnie nudzi " filename too long " fatal błąd.
Kroki
2. przygotuj polecenia migracji i aktualizacji.
Powiedzmy, że robimy to dla Windows (jest trywialne, aby portować na Linuksa).
W katalogu instalacji subgit bin (subgit-2.X. X \ bin), utwórz dwa .akta nietoperzy.
Zawartość pliku / polecenia migracji:
start subgit import --svn-url url://svn.serv/Bla/Bla directory/path/Local.git.Repo
Polecenie "start" jest tutaj opcjonalne (Windows). Pozwoli zobaczyć błędy na Uruchom i pozostawić powłokę otwartą po zakończeniu Podg.
Możesz dodać tutaj dodatkowe parametry podobne do git-svn.
Używam tylko -- default-domain myCompanyDomain.com aby naprawić domenę adresu e-mail autorów SVN.
Mam standardową strukturę repozytorium SVN (trunk/branches/tags) i nie mieliśmy problemów z"mapowaniem autorów". Więc nic już nie robię.
(jeśli chcesz przenieść tagi, takie jak gałęzie lub twój SVN mieć wiele folderów Branch/tags, które możesz rozważyć, aby użyć bardziej szczegółowego podejścia )
Wskazówka 1: użyj --minimal-revision YourSvnRevNumber, aby szybko zobaczyć, jak wszystko się kończy (jakiś rodzaj debugowania).
Szczególnie przydatne jest Zobacz rozwiązane nazwiska autora lub e-maile.
Lub ograniczyć głębokość historii migracji.
Wskazówka 2 : migracja może zostać przerwana ( Ctrl + C ) i przywrócone przez uruchomienie kolejnej aktualizacji polecenie / Plik.
Nie radzę robić tego dla dużych repozytoriów. Otrzymałem "Out of memory Java + Windows exception".
Wskazówka 3 : Lepiej utworzyć kopię repozytorium result bare.
Zawartość pliku / polecenia do aktualizacji:
start subgit import directory/path/Local.git.Repo
Możesz go uruchomić dowolną ilość razy, kiedy chcesz uzyskać commity ostatniego zespołu do twojego repozytorium Git.
Uwaga! nie dotykaj nagiego repozytorium(na przykład tworzenie gałęzi).
Następny błąd krytyczny:
Nieodwracalny błąd: nie są zsynchronizowane i nie można ich zsynchronizować ... Tłumaczenie wersji Subversion na git commit...
3. Uruchom pierwsze polecenie / Plik. To zajmie dużo czasu dla dużego repozytorium. 30 godzin na moje skromne repozytorium.
To wszystko.Możesz aktualizować swoje repozytorium Git z SVN w dowolnym czasie i dowolnej ilości razy, uruchamiając drugi plik / polecenie. I przed zmianą swojego zespół programistów do Git.
To zajmie tylko kilka sekund.
Jest jeszcze jedno przydatne zadanie.
Przeniesienie lokalnego repozytorium Git do zdalnego repozytorium Git
Czy to twoja sprawa? Kontynuujmy.- Konfiguracja pilotów
Run:
$ git remote add origin url://your/repo.git
- przygotuj się do wysłania lokalnego repozytorium Git do zdalnego repozytorium
Domyślnie Twój Git nie może wysyłać dużych kawałków. fatal: Zdalny koniec rozłączył się niespodziewanie
Uciekajmy:
git config --global http.postBuffer 1073741824
524288000 - 500 MB
1073741824 - 1 GB itd.
Napraw swoje lokalne problemy z certyfikatem. Jeśli twój serwer git używa zepsutego certyfikatu.
Wyłączyłem certyfikaty .
Również Twój serwer Git może mieć ograniczenia ilości żądań wymagające korekty.
- przepchnij całą migrację na pilota zespołu Repozytorium Git.
Uruchom z lokalnym Git:
git push origin --mirror
(git push origin '*:*' dla starych wersji Git)
If you get the following: error: cannot spawn git: No such file or directory... Dla mnie pełne odtworzenie mojego repozytorium rozwiązuje ten błąd(30 godzin). Możesz wypróbować następne polecenia
git push origin --all
git push origin --tags
Lub spróbuj ponownie zainstalować Git (bezużyteczny dla mnie ). Możesz też utworzyć gałęzie ze wszystkich tagów i je popchnąć. Lub, lub, albo...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:30
Reposurgeon
W skomplikowanych przypadkach, reposurgeon przezEric S. Raymond jest narzędziem wyboru. Oprócz SVN obsługuje wiele innych systemów kontroli wersji poprzez format fast-export
, a także CVs . Autor donosi o udanych konwersjach starożytnych repozytoriów, takich jak Emacs i FreeBSD .
Narzędzie najwyraźniej ma na celu niemal idealną konwersję (taką jak konwersja właściwości svn:ignore
SVN do .gitignore
plików) nawet dla trudne układy repozytoriów o długiej historii. W wielu przypadkach Inne narzędzia mogą być łatwiejsze w użyciu.
Przed zagłębieniem się w dokumentację linii poleceń reposurgeon
, koniecznie zapoznaj się z doskonałym przewodnikiem migracji DVCS, który krok po kroku omawia proces konwersji.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-17 21:34:36
Ten przewodnik na stronie atlassian jest jednym z najlepszych, jakie znalazłem:
Https://www.atlassian.com/git/migration
To narzędzie- https://bitbucket.org/atlassian/svn-migration-scripts - jest również bardzo przydatny do generowania Twoich autorów.txt między innymi.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-13 13:58:34
Nieco Rozszerzona odpowiedź przy użyciu tylko git, SVN i bash. Zawiera kroki dla repozytoriów SVN, które nie używają konwencjonalnego układu z układem katalogu trunk/branches/tags(SVN nie robi absolutnie nic, aby wymusić taki układ).
Najpierw użyj tego skryptu bash, aby przeskanować repo SVN w poszukiwaniu różnych osób, które przyczyniły się do powstania szablonu dla pliku mapującego:
#!/usr/bin/env bash
authors=$(svn log -q | grep -e '^r' | awk 'BEGIN { FS = "|" } ; { print $2 }' | sort | uniq)
for author in ${authors}; do
echo "${author} = NAME <USER@DOMAIN>";
done
Użyj tego, aby utworzyć plik authors
, w którym mapujesz nazwy użytkowników svn na nazwy użytkowników i e-mail ustawiony przez programistów za pomocą git config
właściwości user.name
i user.email
(zauważ, że dla usługi takiej jak GitHub wystarczy tylko pasujący e-mail).
Wtedy mieć git svn
Sklonuj repozytorium svn do repozytorium git, informując go o mapowaniu:
git svn clone --authors-file=authors --stdlayout svn://example.org/Folder/projectroot
Może to potrwać niesamowicie długo, ponieważ Git svn będzie indywidualnie sprawdzał każdą rewizję dla każdego znacznika lub gałęzi, która istnieje. (zauważ, że znaczniki w SVN są po prostu gałęziami, więc kończą się jako takie w Git). Możesz to przyspieszyć, usuwając stare tagi i gałęzie w SVN, których nie potrzebujesz.
Uruchamianie tego na serwerze w tej samej sieci lub na tym samym serwerze może również naprawdę przyspieszyć to działanie. Ponadto, jeśli z jakiegoś powodu proces ten zostanie przerwany, możesz wznowić go za pomocą
git svn rebase --continue
W wielu przypadkach skończyłeś tutaj. Ale jeśli twój SVN repo ma niekonwencjonalny układ, w którym po prostu masz katalog w SVN, który chcesz umieścić w gałęzi git, możesz zrób kilka dodatkowych kroków.
Najprostszym jest po prostu utworzenie nowego repo SVN na serwerze, który będzie zgodny z konwencją i użyje svn copy
do umieszczenia katalogu w trunku lub gałęzi. Może to być jedyny sposób, jeśli twój katalog znajduje się w katalogu głównym repo, kiedy Ostatnio próbowałem tego git svn
po prostu odmówiłem wykonania kasy.
Możesz również to zrobić używając Gita. Dla git svn clone
po prostu użyj katalogu, który chcesz umieścić w gałęzi git.
Po biegu
git branch --set-upstream master git-svn
git svn rebase
Zauważ, że wymagało to wersji Git 1.7 lub wyższej.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-29 10:41:21
Musisz zainstalować
git
git-svn
Skopiowane z tego linku http://john.albin.net/git/convert-subversion-to-git .
1. Pobranie listy wszystkich komitetów Subversion
Subversion po prostu wyświetla nazwę Użytkownika dla każdego commita. Commity Gita mają znacznie bogatsze dane, ale w najprostszym przypadku autor commitów musi mieć na liście imię i nazwisko oraz adres e-mail. Domyślnie narzędzie git-svn wyświetli tylko nazwę użytkownika SVN zarówno w polu autor, jak i e-mail. Ale z trochę pracy, możesz utworzyć listę wszystkich użytkowników SVN i jakie są ich odpowiednie nazwy Git i e-maile. Lista ta może być używana przez git-svn do przekształcania zwykłych nazw użytkowników svn w odpowiednie kommitatory Git.
Z katalogu głównego twojego lokalnego programu Subversion uruchom polecenie:
svn log -q | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors-transform.txt
To przechwyci wszystkie wiadomości logów, wyrwie nazwy użytkowników, wyeliminuje zduplikowane nazwy użytkowników, posortuje nazwy użytkowników i umieści je w "authors-transform".txt " plik. Teraz edytuj każdą linię w akta. Na przykład, convert:
jwilkins = jwilkins <jwilkins>
Do tego:
jwilkins = John Albin Wilkins <[email protected]>
2. Sklonuj repozytorium Subversion używając git-svn
git svn clone [SVN repo URL] --no-metadata -A authors-transform.txt --stdlayout ~/temp
Spowoduje to standardową transformację git-svn (używając authors-transform.plik txt utworzony w kroku 1) i umieść repozytorium git w folderze "~/temp" wewnątrz katalogu domowego.
3. Konwertuj svn: ignoruj właściwości na .gitignore
Jeśli repo svn używało właściwości SVN: ignore, możesz łatwo przekonwertować to na .plik gitignore:
cd ~/temp
git svn show-ignore > .gitignore
git add .gitignore
git commit -m 'Convert svn:ignore properties to .gitignore.'
4. Push repository to a bare Git repository
Najpierw Utwórz gołe repozytorium i dostosuj domyślną gałąź do nazwy "trunk" svn.
git init --bare ~/new-bare.git
cd ~/new-bare.git
git symbolic-ref HEAD refs/heads/trunk
Następnie przesuń repozytorium temp do nowego repozytorium.
cd ~/temp
git remote add bare ~/new-bare.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare
Możesz teraz bezpiecznie usunąć repozytorium ~/temp.
5. Zmień nazwę gałęzi" trunk "na"master"
Twoja główna gałąź rozwoju będzie nazwana "trunk", który pasuje do nazwy z Subversion. Będziesz chciał zmienić jej nazwę na standardową gałąź "master" Gita używając:
cd ~/new-bare.git
git branch -m trunk master
6. Czyszczenie gałęzi i znaczników
Git-svn tworzy wszystkie znaczniki Subversions w bardzo krótkie gałęzie w Git w postaci "tags/name". Będziesz chciał przekonwertować wszystkie gałęzie na rzeczywiste Tagi Git używając:
cd ~/new-bare.git
git for-each-ref --format='%(refname)' refs/heads/tags |
cut -d / -f 4 |
while read ref
do
git tag "$ref" "refs/heads/tags/$ref";
git branch -D "tags/$ref";
done
Ten krok zajmie trochę pisania. :- ) Ale, nie martw się; powłoka Uniksa zapewni > drugorzędny monit dla extra-długie polecenie zaczynające się od git dla-each-ref.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-22 04:36:33
GitHub ma teraz funkcję importowania z repozytorium SVN . Nigdy nie próbowałem.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-21 02:15:07
Możemy używać komend git svn clone
Jak Poniżej.
svn log -q <SVN_URL> | awk -F '|' '/^r/ {sub("^ ", "", $2); sub(" $", "", $2); print $2" = "$2" <"$2">"}' | sort -u > authors.txt
Powyższe polecenie utworzy plik autorów z commitów SVN.
svn log --stop-on-copy <SVN_URL>
Powyższe polecenie da ci pierwszy numer wersji, gdy twój projekt SVN został utworzony.
git svn clone -r<SVN_REV_NO>:HEAD --no-minimize-url --stdlayout --no-metadata --authors-file authors.txt <SVN_URL>
Powyższe polecenie utworzy repozytorium Git w trybie lokalnym.
Problem polega na tym, że nie konwertuje gałęzi i tagów na push. Będziesz musiał zrobić je ręcznie. Na przykład poniżej dla gałęzi:
$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
* master
remotes/origin/MyDevBranch
remotes/origin/tags/MyDevBranch-1.0
remotes/origin/trunk
$$ git checkout -b MyDevBranch origin/MyDevBranch
Branch MyDevBranch set up to track remote branch MyDevBranch from origin.
Switched to a new branch 'MyDevBranch'
$ git branch -a
* MyDevBranch
master
remotes/origin/MyDevBranch
remotes/origin/tags/MyDevBranch-1.0
remotes/origin/trunk
$
Dla tagów:
$git checkout origin/tags/MyDevBranch-1.0
Note: checking out 'origin/tags/MyDevBranch-1.0'.
You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.
If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:
git checkout -b new_branch_name
HEAD is now at 3041d81... Creating a tag
$ git branch -a
* (detached from origin/tags/MyDevBranch-1.0)
MyDevBranch
master
remotes/origin/MyDevBranch
remotes/origin/tags/MyDevBranch-1.0
remotes/origin/trunk
$ git tag -a MyDevBranch-1.0 -m "creating tag"
$git tag
MyDevBranch-1.0
$
Teraz wypchnij master, gałęzie i tagi do zdalnego repozytorium git.
$ git push origin master MyDevBranch MyDevBranch-1.0
Counting objects: 14, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (14/14), 2.28 KiB | 0 bytes/s, done.
Total 14 (delta 3), reused 0 (delta 0)
To https://github.com/pankaj0323/JDProjects.git
* [new branch] master -> master
* [new branch] MyDevBranch -> MyDevBranch
* [new tag] MyDevBranch-1.0 -> MyDevBranch-1.0
$
Svn2git utility
Svn2git narzędzie usuwa ręczne wysiłki z gałęzi i tagów.
Zainstaluj go za pomocą polecenia sudo gem install svn2git
. Następnie uruchom poniżej polecenia.
$ svn2git <SVN_URL> --authors authors.txt --revision <SVN_REV_NO>
Teraz możesz wymienić gałęzie, znaczniki i łatwo je popchnąć.
$ git remote add origin https://github.com/pankaj0323/JDProjects.git
$ git branch -a
MyDevBranch
* master
remotes/svn/MyDevBranch
remotes/svn/trunk
$ git tag
MyDevBranch-1.0
$ git push origin master MyDevBranch MyDevBranch-1.0
Wyobraź sobie, że masz 20 oddziałów i tagi, oczywiście svn2git zaoszczędzi Ci dużo czasu i dlatego podoba mi się bardziej niż natywne polecenia. Jest to ładny wrapper wokół natywnego polecenia git svn clone
.
Aby uzyskać pełny przykład, zapoznaj się z moim wpisem na blogu .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-02 16:13:49
TortoiseGit robi to. zobacz ten wpis na blogu: http://jimmykeen.net/articles/03-nov-2012/how-migrate-from-svn-to-git-windows-using-tortoise-clients
Tak, Wiem, że odpowiadanie linkami nie jest wspaniałe, ale to rozwiązanie, eh?
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-18 03:41:17
Opublikowałem przewodnik krok po kroku (tutaj), aby przekonwertować svn do Gita, włączając w to konwersję znaczników svn do Gita oraz gałęzi svn do Gita.
Wersja skrócona:
1) klonowanie svn z określonego numeru wersji. (numer wersji musi być najstarszy, który chcesz przenieść)
git svn clone --username=yourSvnUsername -T trunk_subdir -t tags_subdir -b branches_subdir -r aRevisionNumber svn_url gitreponame
2) Pobieranie danych svn. Ten krok zajmuje najwięcej czasu.
cd gitreponame
git svn fetch
Repeat Git svn fetch until finishes without error
3) get master branch aktualizacja
git svn rebase
4) tworzenie lokalnych gałęzi z gałęzi svn poprzez kopiowanie referencji
cp .git/refs/remotes/origin/* .git/refs/heads/
5) Konwertuj znaczniki svn na znaczniki git
git for-each-ref refs/remotes/origin/tags | sed 's#^.*\([[:xdigit:]]\{40\}\).*refs/remotes/origin/tags/\(.*\)$#\2 \1#g' | while read p; do git tag -m "tag from svn" $p; done
6) Umieść repozytorium w lepszym miejscu jak github
git remotes add newrepo [email protected]:aUser/aProjectName.git
git push newrepo refs/heads/*
git push --tags newrepo
Jeśli chcesz więcej szczegółów, przeczytaj mój post lub zapytaj mnie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-25 20:27:14
Gorąco polecam tę krótką serię screencastów właśnie odkryłem. Autor przeprowadzi Cię przez podstawowe operacje i zaprezentuje kilka bardziej zaawansowanych zastosowań.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-22 00:34:48
Jeśli używasz SourceTree, możesz to zrobić bezpośrednio z aplikacji. Goto File - > New / Clone następnie wykonaj następujące czynności:
- wprowadź zdalny adres URL SVN jako "ścieżka źródłowa / URL".
- Wprowadź swoje poświadczenia po wyświetleniu monitu.
- wprowadź lokalizację folderu lokalnego jako "ścieżkę docelową". Nadaj mu nazwę.
- w opcjach zaawansowanych wybierz "Git" z listy rozwijanej w " Create local repozytorium typu".
- możesz opcjonalnie określić wersję do klonowania od. / Align = "Left" /
Otwórz repo w SourceTree, a zobaczysz, że Twoje komunikaty o zatwierdzeniu również zostały przeniesione.
Teraz przejdź do repozytorium - > Ustawienia repozytorium i dodaj nowe zdalne szczegóły repo. Usuń SVN remote jeśli chcesz (zrobiłem to za pomocą opcji "Edytuj plik konfiguracyjny".
Wciśnij kod do nowego zdalnego repo, gdy będziesz gotowy i koduj swobodnie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-17 04:43:33
Na marginesie, polecenie git-stash jest darem niebios podczas próby Gita z git-svn dcommits.
Typowy proces:
- set up Git repo
- do some work on different files
- zdecyduj się sprawdzić niektóre prace w, używając git
- decide to
svn-dcommit
- uzyskaj przerażający błąd "nie można zatwierdzić z brudnym indeksem".
Rozwiązanie (wymaga git 1.5.3+):
git stash; git svn dcommit ; git stash apply
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-26 13:13:26
Oto prosty skrypt powłoki bez zależności, który przekonwertuje jeden lub więcej repozytoriów SVN na Gita i wypchnie je na GitHub.
Https://gist.github.com/NathanSweet/7327535
W około 30 linijkach skryptu: klonuje używając GIT SVN, tworzy a .plik gitignore z SVN:: ignore properties, wepchnie go do repozytorium git, zmieni nazwę SVN trunk NA master, konwertuje znaczniki SVN na znaczniki git i wypycha je do GitHub, zachowując znaczniki.
I went thru a lot z bólu przenieść kilkanaście repozytoriów SVN z kodu Google do Githuba. Nie pomogło, że korzystałem z Windowsa. Ruby był bardzo zepsuty na moim starym Debianie i uruchomienie go na Windowsie było żartem. Inne rozwiązania nie działały ze ścieżkami Cygwina. Nawet gdy coś działa, nie mogłem wymyślić, jak sprawić, by tagi pojawiły się na Githubie (sekret to --follow-tags).
W końcu zebrałem dwa krótkie i proste skrypty, połączone powyżej, i działa świetnie. Rozwiązanie nie musi być bardziej skomplikowane niż to!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-06 14:11:59
Dla użytkowników GitLab umieściłem gist na temat tego, jak migrowałem z SVN tutaj:
Https://gist.github.com/leftclickben/322b7a3042cbe97ed2af
Kroki migracji z SVN do GitLab
Setup
- SVN jest hostowany w
svn.domain.com.au
. - SVN jest dostępny poprzez
http
(inne protokoły powinny działać). - GitLab jest hostowany w
git.domain.com.au
i:- grupa jest tworzona z przestrzenią nazw
dev-team
. - przynajmniej jedno konto użytkownika jest został utworzony, dodany do grupy i posiada klucz SSH dla konta używanego do migracji (test za pomocą
ssh [email protected]
). - projekt
favourite-project
jest tworzony w przestrzeni nazwdev-team
.
- grupa jest tworzona z przestrzenią nazw
- plik
users.txt
zawiera odpowiednie dane użytkownika, po jednym użytkowniku w linii, w postaciusername = First Last <[email protected]>
, gdzieusername
jest nazwą użytkownika podaną w logach SVN. (Zobacz pierwszy link w sekcji Referencje po szczegóły, w szczególności odpowiedź użytkownika Casey).
Wersje
- wersja subversion 1.6.17 (r1128011)
- git Wersja 1.9.1
- GitLab wersja 7.2.1 ff1633f
- Ubuntu server 14.04
Polecenia
bash
git svn clone --stdlayout --no-metadata -A users.txt
http://svn.domain.com.au/svn/repository/favourite-project
cd favourite-project
git remote add gitlab [email protected]:dev-team/favourite-project.git
git push --set-upstream gitlab master
To jest to! Przeładuj stronę projektu w GitLab Web UI, a zobaczysz wszystkie commity i pliki na liście.
Uwagi
- jeśli są nieznani użytkownicy, Komenda
git svn clone
zatrzyma się, w takim przypadku zaktualizujeusers.txt
,cd favourite-project
igit svn fetch
będzie kontynuowana od miejsca, w którym się zatrzymała. - standard
trunk
-tags
-branches
wymagany jest układ repozytorium SVN. - adres URL SVN podany poleceniu
git svn clone
zatrzymuje się na poziomie bezpośrednio powyżejtrunk/
,tags/
ibranches/
. - polecenie
git svn clone
generuje dużo danych wyjściowych, w tym kilka ostrzeżeń na górze; zignorowałem Ostrzeżenia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-04 21:21:16
Chciałem tylko dodać swój wkład do społeczności Gita. Napisałem prosty skrypt bash, który automatyzuje pełny import. W przeciwieństwie do innych narzędzi migracji, to narzędzie opiera się na natywnym git zamiast jGit. To narzędzie obsługuje również repozytoria z dużą historią wersji i lub dużymi blobami. Jest dostępny przez github:
Https://github.com/onepremise/SGMS
Ten skrypt konwertuje projekty zapisane w SVN w następującym formacie:
/trunk
/Project1
/Project2
/branches
/Project1
/Project2
/tags
/Project1
/Project2
Ten schemat jest również popularne i obsługiwane, jak również:
/Project1
/trunk
/branches
/tags
/Project2
/trunk
/branches
/tags
Każdy projekt zostanie zsynchronizowany według nazwy projektu:
Ex: ./migration https://svnurl.com/basepath project1
Jeśli chcesz przekonwertować pełne repo, użyj następującej składni:
Ex: ./migration https://svnurl.com/basepath .
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-16 18:28:52
Im na komputerze z systemem windows i zrobił małą partię, aby przenieść repo SVN z historią (ale bez gałęzi) do repo GIT przez wywołanie
transfer.bat http://svn.my.address/svn/myrepo/trunk https://git.my.address/orga/myrepo
@echo off
SET FROM=%1
SET TO=%2
SET TMP=tmp_%random%
echo from: %FROM%
echo to: %TO%
echo tmp: %TMP%
pause
git svn clone --no-metadata --authors-file=users.txt %FROM% %TMP%
cd %TMP%
git remote add origin %TO%
git push --set-upstream origin master
cd ..
echo delete %TMP% ...
pause
rmdir /s /q %TMP%
Nadal potrzebujesz użytkowników.txt z mapowaniem użytkownika jak
User1 = User One <[email protected]>
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-06 06:37:45
efektywne używanie Gita z Subversion to delikatne wprowadzenie do git-svn. Dla istniejących repozytoriów SVN, git-svn sprawia, że jest to bardzo proste. Jeśli zakładasz nowe repozytorium, znacznie łatwiej jest najpierw utworzyć puste repozytorium SVN, a następnie zaimportować je za pomocą git-svn, niż dzieje się to w przeciwnym kierunku. Utworzenie nowego repozytorium Git i zaimportowanie do SVN może zostać wykonane, ale jest to trochę bolesne, szczególnie jeśli jesteś nowy w Git i masz nadzieję zachować commit historia.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-17 21:20:47
Pobierz Instalator Ruby Dla Windows i zainstaluj z nim najnowszą wersję. Dodaj pliki wykonywalne Ruby do swojej ścieżki.
- Install svn2git
- menu Start - > Wszystkie programy - > Ruby - > Uruchom wiersz polecenia z Ruby
-
Następnie wpisz "Gem install svn2git" i wpisz
Migrate Subversion repository
-
Otwórz wiersz polecenia Ruby i przejdź do katalogu, w którym pliki mają zostać przeniesione
Następnie svn2git http: / / [domena nazwa] / svn / [repozytorium root]
Migracja projektu do Git może potrwać kilka godzin, w zależności od rozmiaru kodu projektu.
-
Ten ważny krok pomaga w tworzeniu struktury repozytorium Git, jak wspomniano poniżej.
SVN (/Project_components) trunk -- > Git master Gałęzie SVN (/Project_components) -- > gałęzie Git Znaczniki SVN (/Project_components) -- > znaczniki Git
Utwórz zdalne repozytorium i przesuń zmiany.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-17 21:28:44
GitHub ma importera. Po utworzeniu repozytorium można zaimportować z istniejącego repozytorium za pomocą jego adresu URL. Poprosi o Twoje poświadczenia, jeśli dotyczy, i stamtąd.
Podczas pracy znajdzie autorów i możesz po prostu mapować ich do użytkowników na Githubie.
Używałem go już przez kilka repozytoriów i jest dość dokładny i znacznie szybszy! Zajęło to 10 minut na repozytorium z ~4000 commitów, a potem zajęło mojemu przyjacielowi cztery dni!
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-17 21:30:42
Kilka odpowiedzi tutaj odnosi się do https://github.com/nirvdrum/svn2git , ale w przypadku dużych repozytoriów może to być powolne. Próbowałem użyć https://github.com/svn-all-fast-export/svn2git zamiast tego jest to narzędzie o dokładnie tej samej nazwie, ale zostało użyte do migracji KDE z SVN do Git.
Trochę więcej pracy, aby go skonfigurować, ale po wykonaniu samej konwersji dla mnie trwało minuty, gdzie drugi skrypt spędził godziny.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-19 14:17:52
Istnieją różne metody osiągnięcia tego celu. Wypróbowałem niektóre z nich i znalazłem naprawdę działający z zainstalowanym tylko git i svn na systemie operacyjnym Windows.
Wymagania wstępne:
- git na windows (używałem tego) https://git-scm.com/
- svn z zainstalowanymi narzędziami konsoli (używałem Tortoise svn)
- zrzut pliku z repozytorium SVN.
svnadmin dump /path/to/repository > repo_name.svn_dump
Kroki do osiągnięcia ostatecznego celu (przeniesienie całego repozytorium z historią do Gita, po pierwsze local git, then remote)
-
Utwórz puste repozytorium (używając narzędzi konsolowych lub tortoiseSVN) w katalogu REPO_NAME_FOLDER
cd REPO_NAME_PARENT_FOLDER
, Umieść dumpfile.dump to REPO_NAME_PARENT_FOLDER -
svnadmin load REPO_NAME_FOLDER < dumpfile.dump
Poczekaj na tę operację, może to być długie To polecenie jest ciche, więc otwórz drugie okno cmd:
svnserve -d -R --root REPO_NAME_FOLDER
Dlaczego po prostu nie użyć file:///...... ? Ponieważ następne polecenie nie powiedzie się zUnable to open ... to URL:
, dzięki odpowiedzi https://stackoverflow.com/a/6300968/4953065-
Utwórz nowy folder SOURCE_GIT_FOLDER
cd SOURCE_GIT_FOLDER
- git svn clone svn: / / localhost / Wait for this operation.
Wreszcie, co mamy?
Sprawdźmy nasze lokalne repozytorium:
git log
Widzisz swoje poprzednie commity? Jeśli tak-ok
Więc teraz masz w pełni funkcjonalne lokalne repozytorium git ze swoimi źródłami i starą historią svn. Teraz, jeśli chcesz przenieść go do jakiegoś serwer, użyj następujących poleceń:
git remote add origin https://fullurlpathtoyourrepo/reponame.git
git push -u origin --all # pushes up the repo and its refs for the first time
git push -u origin --tags # pushes up any tags
W moim przypadku nie potrzebuję komendy tags, ponieważ mój repo nie ma tagów.
Powodzenia!Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 11:47:32
Konwersja svn submodule / folder 'MyModule' do Gita z historią bez tagów i gałęzi.
- git svn clone --no-metadane -- trunk=SomeFolder1/SomeFolder2/SomeFolder3 / MyModule http://svnhost:port/repo_root_folder/MyModule_temp - A C:\cheetah\svn\authors-transform.txt
- git clone MyModule_temp MyModule
- cd MyModule
- git flow init
- Git remote set-url pochodzenie https://userid@stashhost/stash/scm/xyzxyz/MyModule.git
- git push-u origin master
- git push-u origin develop
Aby zachować listę ignorowanych svn użyj powyższych komentarzy po kroku 1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-07 16:02:29