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.

Author: Milan Babuškov, 2008-09-17

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
 498
Author: jfm3,
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
 1480
Author: cmcginty,
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
 184
Author: zoul,
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

 67
Author: Thiago Leão Moreira,
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"

 56
Author: webmat,
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!
 29
Author: Alexander Kitaev,
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
 16
Author: EfForEffort,
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
 13
Author: kpd,
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.

Oto mój sposób.

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

1. Pobierz Podgit

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.
  1. Konfiguracja pilotów

Run:

$ git remote add origin url://your/repo.git
  1. 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.

  1. 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...

 12
Author: it3xl,
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.

 8
Author: Peter Mortensen,
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.

 7
Author: Andrew B,
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.

 6
Author: thoutbeckers,
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.

 6
Author: Valarpirai,
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.

 5
Author: webmat,
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 .

 5
Author: Pankaj,
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?

 4
Author: CAD bloke,
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.

 4
Author: Pablo Belaustegui,
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ń.

 3
Author: ripper234,
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:

  1. wprowadź zdalny adres URL SVN jako "ścieżka źródłowa / URL".
  2. Wprowadź swoje poświadczenia po wyświetleniu monitu.
  3. wprowadź lokalizację folderu lokalnego jako "ścieżkę docelową".
  4. Nadaj mu nazwę.
  5. w opcjach zaawansowanych wybierz "Git" z listy rozwijanej w " Create local repozytorium typu".
  6. możesz opcjonalnie określić wersję do klonowania od.
  7. / 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.

 3
Author: Craig Myles,
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:

  1. set up Git repo
  2. do some work on different files
  3. zdecyduj się sprawdzić niektóre prace w, używając git
  4. decide to svn-dcommit
  5. 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
 2
Author: Gregg Lind,
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!

 2
Author: NateS,
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 nazw dev-team.
  • plik users.txt zawiera odpowiednie dane użytkownika, po jednym użytkowniku w linii, w postaci username = First Last <[email protected]>, gdzie username 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 zaktualizuje users.txt, cd favourite-project i git 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żej trunk/, tags/ i branches/.
  • polecenie git svn clone generuje dużo danych wyjściowych, w tym kilka ostrzeżeń na górze; zignorowałem Ostrzeżenia.
 2
Author: Xharze,
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 .
 1
Author: Jason Huntley,
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

Może każdy może go użyć. Tworzy folder TMP-sprawdza tam repo SVN za pomocą Gita i dodaje nowe pochodzenie i wypycha je... i usuwa folder ponownie.
@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]>
 1
Author: cljk,
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.

 0
Author: burkestar,
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.

 0
Author: Nanda,
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!

 0
Author: Josh Benson,
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.

 0
Author: Zitrax,
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:

  1. git na windows (używałem tego) https://git-scm.com/
  2. svn z zainstalowanymi narzędziami konsoli (używałem Tortoise svn)
  3. 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)

  1. 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

  2. svnadmin load REPO_NAME_FOLDER < dumpfile.dump Poczekaj na tę operację, może to być długie

  3. 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ę z Unable to open ... to URL:, dzięki odpowiedzi https://stackoverflow.com/a/6300968/4953065

  4. Utwórz nowy folder SOURCE_GIT_FOLDER

  5. cd SOURCE_GIT_FOLDER
  6. 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!
 0
Author: Ruslan Makrenko,
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.

Aby zachować listę ignorowanych svn użyj powyższych komentarzy po kroku 1

 0
Author: PShetty,
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