Przeniesienie istniejącego repozytorium git do SVN

Wykonywałam całą swoją pracę w Git i naciskałam na GitHub. Byłem bardzo zadowolony zarówno z oprogramowania, jak i strony i nie mam zamiaru zmieniać moich praktyk pracy w tym momencie.

Mój doradca doktorski prosi wszystkich studentów, aby utrzymywali swoją pracę w repozytorium SVN, które jest hostowane na Uniwersytecie. Znalazłem mnóstwo dokumentacji i samouczków na temat ściągnięcia istniejącego repo SVN do git, ale nic o przepychaniu repo git do nowego repo SVN. Spodziewam się, że musi być jakiś sposób. aby zrobić to z połączeniem git-svn i świeżej gałęzi, rebasingu i wszystkich tych wspaniałych terminów, ale jestem początkującym git i nie czuję się pewnie z żadnym z nich.

Chcę po prostu uruchomić kilka komend, aby wypchnąć commity do tego repo SVN kiedy wybieram, chcę nadal używać Git i po prostu mieć lustro repo SVN co jest w Git.

Będę jedyną osobą, która zaangażuje się w SVN, jeśli to coś zmieni.

Wszelkie instrukcje jak to zrobić byłyby bardzo bardzo doceniam!

Author: cflewis, 2009-03-19

17 answers

Ja też tego potrzebowałem, i z Pomocą odpowiedzi Bombe + trochę majstrowania, udało mi się. Oto przepis:

Import git -> svn

1. cd /path/to/git/localrepo
2. svn mkdir --parents protocol:///path/to/repo/PROJECT/trunk -m "Importing git repo"
3. git svn init protocol:///path/to/repo/PROJECT -s
4. git svn fetch
5. git rebase origin/trunk
5.1.  git status
5.2.  git add (conflicted-files)
5.3.  git rebase --continue
5.4.  (repeat 5.1.)
6. git svn dcommit

Po #3 otrzymasz tajemniczą wiadomość taką jak ta:

Użycie wyższego poziomu URL: protocol:///path/to/repo/PROJECT => protocol:///path/to/repo

Zignoruj to.

Kiedy uruchomisz #5, możesz} mieć konflikty. Rozwiąż je, dodając pliki ze stanem "unmerged" i wznawiając rebase. W końcu skończysz, a następnie zsynchronizuj powrót do svn-repo, używając dcommit. To wszystko.

Synchronizacja transakcji

Możesz teraz zsynchronizować z svn - > git, używając następujących poleceń:

git svn fetch
git rebase trunk

I aby zsynchronizować z git - > svn, użyj:

git svn dcommit

Uwaga końcowa

Możesz wypróbować to na lokalnej kopii, przed złożeniem wniosku o repozytorium na żywo. Możesz zrobić kopię swojego git-repo w tymczasowym miejscu, po prostu używając cp -r, ponieważ wszystkie dane znajdują się w samym repo. Następnie można skonfigurować repo testowe oparte na plikach, użycie:

svnadmin create /home/name/tmp/test-repo

I sprawdzić kopię roboczą, używając:

svn co file:///home/name/tmp/test-repo svn-working-copy

To pozwoli Ci bawić się rzeczami przed dokonaniem jakichkolwiek trwałych zmian.

Dodatek: If you mess up git svn init

Jeśli przypadkowo uruchomiłeś git svn init z niewłaściwym adresem url, a nie byłeś wystarczająco mądry, aby wykonać kopię zapasową swojej pracy (nie pytaj ...), nie można po prostu uruchomić ponownie tego samego polecenia. Można jednak cofnąć zmiany, wydając:

rm -rf .git/svn
edit .git/config

I usunąć sekcję [svn-remote "svn"] sekcja.

Możesz uruchomić git svn init od nowa.

 390
Author: troelskn,
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-07-22 15:32:37

Oto Jak to zrobiliśmy:

Sklonuj git repo somwhere na swojej maszynie. Otwórz .git / config i dodać następujące(z http://www.kerrybuckley.org/2009/10/06/maintaining-a-read-only-svn-mirror-of-a-git-repository/):

[svn-remote "svn"]
    url = https://your.svn.repo
    fetch = :refs/remotes/git-svn

Teraz, z okna konsoli, wpisz te :

git svn fetch svn
git checkout -b svn git-svn
git merge master

Teraz, jeśli złamie się tutaj z jakiegokolwiek powodu, wpisz te 3 linie:

git checkout --theirs .
git add .
git commit -m "some message"

I wreszcie, można zobowiązać się do svn

git svn dcommit

Uwaga: zawsze usuwam ten folder potem.

Zdrówko !
 28
Author: Alex Rouillard,
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-01-19 19:56:40

Bezpośrednie użycie git rebase spowoduje utratę pierwszego commita. Git traktuje to inaczej i nie może go zmienić.

Istnieje procedura, która zachowa pełną historię: http://kerneltrap.org/mailarchive/git/2008/10/26/3815034

Przepisam tutaj rozwiązanie, ale kredyty są dla Björna.

Initialize git-svn:

git svn init -s --prefix=svn/ https://svn/svn/SANDBOX/warren/test2

Prefiks -- umożliwia zdalne śledzenie gałęzi, takich jak "svn / trunk", które jest miły, bo nie dostajesz dwuznacznych imion, jeśli dzwonisz twój lokalny branch po prostu "pnia" wtedy. And-s jest skrótem do standardu układ tułowia/znaczników / gałęzi.

Pobierz początkowe rzeczy z svn:

git svn fetch

Teraz sprawdź hash głównego commita (powinien pokazywać pojedynczy commit):

git rev-list --parents master | grep '^.\{40\}$'

Następnie uzyskaj hash pustego zatwierdzenia trunka:

git rev-parse svn/trunk

Utworzyć przeszczep:

echo <root-commit-hash> <svn-trunk-commit-hash> >> .git/info/grafts

Teraz, "gitk" powinien pokazać svn / trunk jako pierwszy commit, na którym twój bazuje na gałęzi master.

Zrobić przeszczep stały:

git filter-branch -- ^svn/trunk --all

Upuść przeszczep:

rm .git/info/grafts
[[9]}Gitk powinien nadal pokazywać svn / trunk w przodku mistrza

Linearize your history on top of trunk:

git svn rebase

A teraz "Git svn dcommit-n" powinno ci powiedzieć, że zamierza zatwierdzić do bagażnika.

git svn dcommit
 27
Author: ,
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
2009-05-05 13:55:01

Utwórz nowy katalog w repozytorium subversion dla Twojego projektu.

# svn mkdir --parents svn://ip/path/project/trunk

Zmień swój projekt zarządzany przez Git i uruchom git-svn.

# git svn init svn://ip/path/project -s
# git svn fetch

Utworzy to pojedynczy commit, ponieważ katalog projektu svn jest nadal pusty. Teraz Przełącz wszystko na commit, git svn dcommit i powinieneś skończyć. To będzie poważnie bałagan daty commit, choć.

 8
Author: Bombe,
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
2009-03-19 10:14:19

Git - > SVN z pełną historią zatwierdzeń

Miałem projekt Gita i musiałem przenieść go do SVN. Tak to zrobiłem, zachowując całą historię zmian. Jedyną rzeczą, która się gubi jest oryginalny czas commit, ponieważ libSVN ustawi czas lokalny, kiedy git svn dcommit.

Howto:

1) Mamy repozytorium svn, do którego chcemy zaimportować nasze rzeczy i sklonować je za pomocą git-svn:

git svn clone https://path.to/svn/repository repo.git-svn

2) Go tam:

cd repo.git-svn

3) Dodaj zdalny repozytorium git (w tym przykładzie im używając C:/Projects/repo.git ) chcesz wcisnąć do svn i nadać mu nazwę old-git:

git remote add old-git file:///C/Projects/repo.git/

4) pobranie informacji z gałęzi master ze starego-git repo do bieżącego repo:

git fetch old-git master

5) wymeldowanie gałęzi master programu old-git remote do nowej gałęzi o nazwie old w bieżącym repo:

git checkout -b old old-git/master

6) Rebase, aby umieścić HEAD on top of old-Git / master. To utrzyma wszystkie Twoje commity. To, co robi w zasadzie, to wziąć całą swoją pracę wykonaną w git i umieścić ją na szczycie pracy, do której uzyskujesz dostęp z svn.

git rebase master

7) a teraz wracaj do swojej gałęzi master:

git checkout master

I widać, że masz czystą historię zmian. To jest to, co chcesz wcisnąć do svn.

8) Przenieś swoją pracę do svn:

git svn dcommit

To wszystko. Bardzo czysty, bez hackingu, wszystko działa idealnie po wyjęciu z pudełka. Smacznego.
 7
Author: codingdave,
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-03-16 10:13:41

Proponuję bardzo krótką instrukcję w 4 poleceniach używając SubGit. Zobacz ten post Po szczegóły.

 4
Author: Dmitry Pavlenko,
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:18
 3
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
2009-06-29 06:18:58

Musiałem zatwierdzić mój istniejący Git repo do pustego SVN repo.

Oto jak udało mi się to zrobić:

$ git checkout master
$ git branch svn
$ git svn init -s --prefix=svn/ --username <user> https://path.to.repo.com/svn/project/
$ git checkout svn
$ git svn fetch
$ git reset --hard remotes/svn/trunk
$ git merge master
$ git svn dcommit

Działał bez problemów. Mam nadzieję, że to komuś pomoże.

Ponieważ musiałem autoryzować się za pomocą innej nazwy użytkownika niż repo svn (moje pochodzenie używa klucza prywatnego/publicznego auth), musiałem użyć właściwości --username.

 3
Author: Jay Linski,
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-05-09 09:36:01

Jeśli chcesz nadal pracować z Gitem jako głównym repozytorium i od czasu do czasu musisz "wyeksportować" wersje do svn, możesz użyć tailor aby utrzymać synchronizację repozytorium svn. Może kopiować wersje pomiędzy różnymi systemami kontroli źródeł i aktualizować svn o zmiany wprowadzone w git.

Nie próbowałem konwersji git - > svn, ale dla przykładu svn - > svn zobacz ta odpowiedź.

 2
Author: sth,
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:02:53

Jeśli nie musisz używać żadnego konkretnego svn I używasz Github, możesz użyć ich złącza svn.

Więcej informacji tutaj https://github.com/blog/1178-collaborating-on-github-with-subversion

 1
Author: elMarioFredo,
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-02-19 20:46:01

Chciałbym podzielić się wielkim narzędziem wykorzystywanym w społeczności WordPress o nazwie Scatter

Http://evansolomon.me/notes/git-wordpress-plugins-and-a-bit-of-sanity-scatter/

Pozwala to użytkownikom na wysyłanie repo do git WordPress.org SVN automatycznie. W teorii kod ten można zastosować do dowolnego repo SVN.

 1
Author: r109,
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-03-27 21:59:54

Możesz zrobić nowy repo svn. Eksportuj swój projekt git (pliki git). Dodaj go do svn repo (inicjalizując repo tym, co miałeś do tej pory w git). Następnie użyj instrukcji importowania repozytoriów svn w nowym projekcie git.

Ale to spowoduje utratę Twojej poprzedniej historii Gita.

 0
Author: Vasil,
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
2009-03-19 04:12:13

Po prostu chcę podzielić się moim doświadczeniem z zaakceptowaną odpowiedzią. Zrobiłem wszystkie kroki i wszystko było w porządku przed uruchomieniem ostatniego kroku

git svn dcommit

$ Git svn dcommit

Użycie niezainicjalizowanej wartości $u w zastępstwie (s///) W/usr/lib/perl5 / vendor_perl / 5.22 / GIT / SVN.pm linii 101.

Użycie niezainicjalizowanej wartości $u w konkatenacji (.) lub string w /usr / lib / perl5/vendor_perl/5.22/GIT / SVN.pm linii 101. refs / piloty / pochodzenie / Głowica: " https://192.168.2.101/svn/PROJECT_NAME' nie znaleziono w "

Znalazłem ten wątek https://github.com/nirvdrum/svn2git/issues/50

I na koniec rozwiązanie, które zastosowałem w poniższym pliku w linii 101 /usr / lib / perl5/vendor_perl/5.22/GIT / SVN.pm

Zastąpiłem

$u =~ s!^\Q$url\E(/|$)!! or die

I zastępuje

if(!$u) {
    $u = $pathname;
}else {
    $u =~ s!^\Q$url\E(/|$)!! or die
    "$refname: '$url' not found in '$u'\n";
}

To naprawiło mój problem

 0
Author: Pavel Slepiankou,
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-12-01 08:36:10

W moim przypadku musiałem zainicjować czysty projekt z SVN

$ Project> git svn init protocol://path/to/repo -s
$ Project> git svn fetch

Dodaj wszystkie źródła projektu...

$ Project> git add .
$ Project> git commit -m "Importing project sources"
$ Project> git svn dcommit
 0
Author: dangt85,
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-12-02 20:25:31

Wiem, że to bardzo stare pytanie, ale ostatnio musiałem przenieść kilka reposów Gita do SVN, i po wypróbowaniu wszystkich rozwiązań, które udało mi się znaleźć, to co w końcu zadziałało dla mnie to Mercurial (Tak, używając third VCS). Korzystając z tego poradnika , wymyśliłem następujący proces(na Linuksie, ale podstawowa idea powinna działać również na Windowsie).

  1. Niezbędne pakiety:

    $ sudo apt-get install git subversion mercurial python-subversion
    
  2. Mercurial musi być skonfigurowany przez dodanie po ~/.hgrc:

    [extensions]
    hgext.convert=
    
  3. Utwórz tymczasowe katalogi robocze (miałem kilka repozytoriów do migracji, więc utworzyłem Katalogi dla wersji SVN i Git, aby zachować je osobno): {]}

    $ mkdir svn
    $ mkdir git
    
  4. Utwórz puste lokalne repozytorium SVN:

    $ svnadmin create svn/project
    
  5. Sklonuj istniejące repozytorium Git:
    $ git clone server/path/project.git git/project
    
  6. Niech Mercurial zrobi swoje:

    $ hg convert --dest-type svn git/project svn/project
    
  7. Teraz repo SVN powinno zawierać pełną historię zmian, ale nie z oryginalnymi znacznikami czasu. Jeśli to nie jest problem, pomiń następną część do kroku 11.

  8. Przy odrobinie pracy, Data i godzina każdego commita mogą zostać zmienione . Ponieważ moje repo są dość małe, było dla mnie wykonalne, aby zrobić to ręcznie. Po pierwsze, Utwórz hook pre-revprop-change W repo SVN z następującą zawartością, aby umożliwić modyfikację niezbędnej właściwości:

    #!/bin/bash
    exit 0;
    

    Ten skrypt musi być wykonywalny:

    $ chmod +x svn/project/hooks/pre-revprop-change
    
  9. Mercurial utworzono roboczą kopię repo SVN o nazwie project-wc, więc przełącz się na nią i edytuj czas zatwierdzania:

    $ cd project-wc
    $ svn propedit svn:date --revprop -r 1
    

    Wprowadź poprawną datę i godzinę (zwróć uwagę na strefy czasowe!) i zapisz, powinieneś otrzymać komunikat "Set new value for property svn:date on revision 1".
    Teraz spłucz i powtórz dla każdej innej rewizji.

  10. Opcjonalnie Sprawdź historię zatwierdzeń, aby upewnić się, że wszystko wygląda dobrze:

    $ svn log -r 1:HEAD
    

    Potem wróć na górę poziom:

    $ cd ..
    
  11. Zrzuć repozytorium:

    $ svnadmin dump svn/project > project.dump
    
  12. I załaduj zrzut na serwer Subversion. Zrobione!

Ten proces prawdopodobnie działałby również bezpośrednio między zdalnymi repozytoriami, ale łatwiej było mi pracować z lokalnymi. Naprawianie czasów commitów było dużo pracy, ale ogólnie proces był o wiele prostszy niż jakakolwiek inna metoda, jaką znalazłem.

 0
Author: Indrek,
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:02:53

Jeszcze jedna sekwencja, która zadziałała (z kilkoma komentarzami na każdym kroku):

  1. zainstaluj git-svn i subversion Zestawy narzędzi:

sudo apt-get install git-svn subversion

  1. switch inside the PROJECT_FOLDER

cd PROJECT_FOLDER

  1. Utwórz ścieżkę projektu na serwerze Subversion (niestety obecna wtyczka git-svn ma wadę w porównaniu z TortoiseSVN) nie jest w stanie zapisać kodu źródłowego bezpośrednio do PROJECT_FOLDER zamiast tego domyślnie załaduje cały kod do PROJECT_FOLDER/trunk

svn mkdir --parents protocol:///path/to/repo/PROJECT_FOLDER/trunk -m "creating git repo placeholder" jest to miejsce, gdzie trunk na końcu ścieżki jest obowiązkowe

  1. initialize {[0] } plugin context inside the .git folder

git svn init -s protocol:///path/to/repo/PROJECT_FOLDER jest to miejsce, w którym trunk na końcu ścieżki jest niepotrzebne

  1. Pobierz puste Subversion Informacje o repozytorium

git svn fetch ten krok pomaga zsynchronizować Serwer Subversion z wtyczką git-svn. to jest moment kiedy git-svn plugin tworzy ścieżkę remotes/origin i kojarzy ją z podfolderem trunk po stronie serwera

  1. rebase old git commity miały miejsce zanim wtyczka git-svn zaangażowała się w proces (ten krok jest opcjonalny )

git rebase origin/trunk

  1. dodaj nowe / zmodyfikowane pliki do zatwierdzenia (ten krok jest regularny dla git działań i jest opcjonalny)

git add .

  1. commit świeżo dodane pliki do lokalnego repozytorium git (to krok jest opcjonalny i ma zastosowanie tylko wtedy, gdy zastosowano Krok 7)

git commit -m "Importing git repo"

  1. przeniesienie całej historii zmian projektu na Serwer Subversion

git svn dcommit

 0
Author: Oleg Kokorin,
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-06-25 14:32:25

Co jeśli nie chcesz zatwierdzać każdego commita, który wykonujesz w Git, do repozytorium SVN? Co zrobić, jeśli chcesz tylko selektywnie wysyłać commity do rury? Cóż. Mam lepsze rozwiązanie.

Trzymam jeden lokalny Git repo gdzie wszystko co robię to fetch i merge z SVN. W ten sposób mogę się upewnić, że włączam wszystkie te same zmiany co SVN, ale moja historia zmian jest całkowicie oddzielona od SVN.

Następnie przechowuję osobną lokalną kopię roboczą SVN, która znajduje się w osobnym folderze. To jest ten, z którego wykonuję commity do SVN i po prostu używam do tego narzędzia wiersza poleceń SVN.

Kiedy jestem gotowy, aby zatwierdzić stan mojego lokalnego git repo do SVN, po prostu kopiuję cały bałagan plików do lokalnej kopii roboczej SVN i zatwierdzam go stamtąd używając SVN zamiast git.

W ten sposób nigdy nie muszę robić żadnego rebasingu, ponieważ rebasing jest jak freebasing.

 -1
Author: CommaToast,
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-09 05:51:23