Całą swoją pracę wykonywałem w Git i naciskałem na GitHub. Jestem bardzo zadowolony zarówno z oprogramowania, jak i strony, i nie chcę w tym momencie zmieniać moich praktyk pracy.
Mój doradca doktorski prosi wszystkich studentów o zachowanie pracy w repozytorium SVN, które jest hostowane na uniwersytecie. Znalazłem mnóstwo dokumentacji i samouczków na temat ściągania istniejącego repozytorium SVN do Git, ale nic o pchaniu repozytorium Git do świeżego repozytorium SVN. Spodziewam się, że musi być jakiś sposób na połączenie git-svn ze świeżą gałęzią, rebasingiem i wszystkimi tymi cudownymi warunkami, ale jestem początkującym Gitem i nie czuję się pewnie w żadnym z nich.
Następnie chcę po prostu uruchomić kilka poleceń, aby wypchnąć zatwierdzenia do tego repozytorium SVN, kiedy zdecyduję. Chcę nadal używać Git i po prostu mieć lustro repozytorium SVN, co jest w Git.
Będę jedyną osobą, która kiedykolwiek zaangażuje się w SVN, jeśli to coś zmieni.
Odpowiedzi:
Potrzebowałem tego również i przy pomocy odpowiedzi Bombe + trochę błąkania się, udało mi się. Oto przepis:
Importuj Git -> Subversion
Po # 3 otrzymasz tajemniczą wiadomość:
Zignoruj to.
Po uruchomieniu nr 5 możesz mieć konflikty. Rozwiąż je, dodając pliki ze stanem „unmerged” i wznawiając rebase. W końcu skończysz; następnie zsynchronizuj z repozytorium SVN, używając
dcommit
. To wszystko.Synchronizacja repozytoriów
Możesz teraz synchronizować z SVN do Git, używając następujących poleceń:
Aby zsynchronizować dane z Git do SVN, użyj:
Ostatnia uwaga
Możesz wypróbować to na lokalnej kopii, zanim zastosujesz się do repozytorium na żywo. Możesz zrobić kopię swojego repozytorium Git w tymczasowym miejscu; po prostu użyj
cp -r
, ponieważ wszystkie dane znajdują się w samym repozytorium. Następnie można skonfigurować repozytorium testowe oparte na plikach, używając:I sprawdź kopię roboczą, używając:
To pozwoli ci bawić się przedmiotami przed wprowadzeniem jakichkolwiek trwałych zmian.
Dodatek: Jeśli popsuniesz
git svn init
Jeśli przypadkowo uruchomisz
git svn init
z niewłaściwym adresem URL i nie jesteś wystarczająco inteligentny, aby wykonać kopię zapasową swojej pracy (nie pytaj ...), nie możesz po prostu ponownie uruchomić tego samego polecenia. Możesz jednak cofnąć zmiany, wydając:I usuń sekcję
[svn-remote "svn"]
sekcji.Następnie możesz uruchomić od
git svn init
nowa.źródło
Oto, w jaki sposób sprawiliśmy, że działało:
Sklonuj swoje repozytorium Git gdzieś na komputerze.
Otwórz .git / config i dodaj następujące (z Utrzymania tylko lustro SVN repozytorium Git tylko do odczytu ):
Teraz w oknie konsoli wpisz:
Teraz, jeśli z jakiegoś powodu się zepsuje, wpisz te trzy wiersze:
I na koniec możesz zatwierdzić SVN:
Uwaga: zawsze później usuwam ten folder.
źródło
Unable to determine upstream SVN information from HEAD history.
git merge -s recursive -Xtheirs --allow-unrelated-histories master
.Użycie
git rebase
bezpośrednie spowoduje utratę pierwszego zatwierdzenia. 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
Tutaj opiszę rozwiązanie, ale podziękowania należą się Björnowi.
Zainicjuj git-svn:
--Prefix daje zdalne gałęzie śledzące, takie jak „svn / trunk”, co jest miłe, ponieważ nie otrzymujesz niejednoznacznych nazw, jeśli nazywasz swój oddział lokalny tylko „trunk”. I
-s
jest skrótem dla standardowego bagażnika / tagów / Układ oddziałów.Pobierz początkowe pliki z SVN:
Teraz sprawdź hash twojego głównego zatwierdzenia (powinien pokazywać pojedynczy zatwierdzenie):
Następnie uzyskaj skrót pustego zatwierdzenia trunkingu:
Utwórz przeszczep:
Teraz „gitk” powinien pokazywać się
svn/trunk
jako pierwszy zatwierdzenie, na którym oparta jest twoja gałąź master.Uczyń przeszczep trwałym:
Upuść przeszczep:
gitk powinien nadal pokazywać
svn/trunk
w przodkach mistrza.Zlinearyzuj swoją historię nad bagażnikiem:
A teraz „git svn dcommit -n” powinien powiedzieć ci, że zobowiązuje się do trunkingu.
źródło
Utwórz nowy katalog w repozytorium Subversion dla swojego projektu.
Przejdź do projektu zarządzanego przez Git i zainicjuj git-svn.
Spowoduje to utworzenie pojedynczego zatwierdzenia, ponieważ katalog projektu SVN jest nadal pusty. Teraz oprzyj wszystko na tym zatwierdzeniu
git svn dcommit
i powinieneś to zrobić. Poważnie zepsuje to jednak daty zatwierdzenia.źródło
Git -> SVN z pełną historią zatwierdzeń
Miałem projekt Git i musiałem go przenieść do SVN. Tak to zrobiłem, zachowując całą historię popełnień. Jedyne, co się gubi, to oryginalny czas zatwierdzenia, ponieważ libSVN ustawi czas lokalny, kiedy to zrobimy
git svn dcommit
.Jak:
Posiadamy repozytorium SVN, do którego chcemy zaimportować nasze rzeczy i sklonować je za pomocą git-svn:
Idź tam:
Dodaj zdalne repozytorium Git (w tym przykładzie używam C: /Projects/repo.git ). Chcesz przesłać do SVN i nadać mu nazwę old-git:
Pobierz informacje z gałęzi master ze starego repozytorium git do bieżącego repozytorium:
Kasa master oddziału zdalnego starego gita do nowej gałęzi o nazwie old w bieżącym repozytorium:
Rebase, aby umieścić HEAD na old-git / master. Pozwoli to zachować wszystkie twoje zobowiązania. To w zasadzie polega na tym, aby wziąć całą swoją pracę wykonaną w Git i umieścić ją na wierzchu pracy, do której uzyskujesz dostęp z SVN.
Teraz wróć do głównej gałęzi:
I widać, że masz czystą historię zatwierdzeń. Właśnie to chcesz przekazać do SVN.
Przekaż swoją pracę do SVN:
To wszystko. Jest bardzo czysty, nie hakuje, a wszystko działa idealnie po wyjęciu z pudełka. Cieszyć się.
źródło
git svn
potrzebnych jest kilka wstępnych wersji.Proponuję bardzo krótką instrukcję w 4 poleceniach przy użyciu SubGit . Zobacz ten post, aby uzyskać szczegółowe informacje.
źródło
Musiałem zatwierdzić moje istniejące repozytorium Git w pustym repozytorium SVN.
Tak udało mi się to zrobić:
Działa bez problemów. Mam nadzieję, że to komuś pomoże.
Ponieważ musiałem się autoryzować przy użyciu innej nazwy użytkownika niż repozytorium SVN (moje
origin
uwierzytelnianie przy użyciu klucza prywatnego / publicznego), musiałem użyć tej--username
właściwości.źródło
git-svn
zanim będzie to możliwe, zobacz stackoverflow.com/questions/527037/git-svn-not-a-git-commandJeśli chcesz kontynuować pracę z Git jako głównym repozytorium i od czasu do czasu musisz tylko „eksportować” wersje do SVN, możesz użyć programu Tailor, aby utrzymać synchronizację repozytorium SVN. Może kopiować wersje między różnymi systemami kontroli źródła i aktualizowałby SVN o zmiany wprowadzone w Git.
Nie próbowałem konwersji Git-SVN, ale dla przykładu SVN -> SVN zobacz tę odpowiedź .
źródło
Kolejna sekwencja, która zadziałała (z pewnymi komentarzami na każdym etapie):
Zainstaluj
git-svn
isubversion
zestawy narzędzi:Przełącz wewnątrz
PROJECT_FOLDER
Utwórz ścieżkę projektu na serwerze Subversion (niestety obecna
git-svn
wtyczka ma wadę w porównaniu z TortoiseSVN). Nie można przechowywać kodu źródłowego bezpośrednio wPROJECT_FOLDER
. Zamiast tego domyślnie prześle cały kod doPROJECT_FOLDER/trunk
.svn mkdir - protokół rodziców: /// ścieżka / do / repo / PROJECT_FOLDER / trunk -m "tworzenie symbolu zastępczego git repo"
Jest to miejsce, w którym
trunk
na końcu ścieżki jest obowiązkoweZainicjuj
git-svn
kontekst wtyczki w.git
folderzeTo miejsce, w którym
trunk
na końcu ścieżki nie jest koniecznePobierz puste
Subversion
informacje o repozytoriumTen krok pomaga zsynchronizować serwer Subversion z
git-svn
wtyczką. Jest to moment, w którymgit-svn
wtyczka ustalaremotes/origin
ścieżkę i kojarzy ją ztrunk
podfolderem po stronie serwera.Rebase stare zatwierdzenia Git wydarzyły się zanim
git-svn
wtyczka zaangażowała się w ten proces (ten krok jest opcjonalny )Dodaj nowe / zmodyfikowane pliki do zatwierdzenia (ten krok jest regularny dla działań Git i jest opcjonalny )
Zatwierdź świeżo dodane pliki do lokalnego repozytorium Git (ten krok jest opcjonalny i ma zastosowanie tylko wtedy, gdy zastosowano krok 7):
Przekazanie całej historii zmian projektu do serwera Subversion:
źródło
Możesz utworzyć nowe repozytorium SVN. Wyeksportuj swój projekt Git (rozwijając pliki .git). Dodaj go do repozytorium SVN (inicjowanie repozytorium z tym, co do tej pory miałeś w Git). Następnie skorzystaj z instrukcji importowania repozytoriów SVN w nowym projekcie Git.
Spowoduje to jednak utratę poprzedniej historii Git.
źródło
Jeśli nie musisz używać żadnego konkretnego SVN i korzystasz z GitHub, możesz użyć jego złącza SVN.
Więcej informacji tutaj: Współpraca w GitHub z Subversion
źródło
Chciałbym udostępnić świetne narzędzie używane w społeczności WordPress o nazwie Scatter
Wtyczki Git WordPress i odrobina rozsądku
Dzięki temu użytkownicy mogą automatycznie wysyłać swoje repozytorium Git do wordpress.org SVN. Teoretycznie ten kod można zastosować do dowolnego repozytorium SVN.
źródło
Niedawno musiałem przeprowadzić migrację kilku repozytoriów Git do SVN i po wypróbowaniu wszystkich rozwiązań, jakie udało mi się znaleźć, w końcu zadziałał Mercurial (tak, używając trzeciego VCS). Korzystając z tego przewodnika , wymyśliłem następujący proces (w systemie Linux, ale podstawowy pomysł powinien również działać w systemie Windows).
Niezbędne pakiety:
Mercurial należy skonfigurować, dodając następujące elementy do
~/.hgrc
:Utwórz tymczasowe katalogi robocze (miałem do migracji kilka repozytoriów, więc utworzyłem katalogi dla wersji SVN i Git, aby je rozdzielić):
Utwórz puste lokalne repozytorium SVN:
Sklonuj istniejące repozytorium Git:
Niech Mercurial zrobi to samo:
Teraz repozytorium SVN powinno zawierać pełną historię zatwierdzeń, ale nie powinno zawierać oryginalnych znaczników czasu. Jeśli to nie jest problem, przejdź do następnej części do kroku 11.
Przy odrobinie pracy można zmienić datę i godzinę każdego zatwierdzenia . Ponieważ moje repozytoria są dość małe, wykonałem to ręcznie. Najpierw utwórz
pre-revprop-change
hak w repozytorium SVN z następującą zawartością, aby umożliwić modyfikację niezbędnych właściwości:Ten skrypt musi być wykonywalny:
Mercurial utworzył kopię roboczą repozytorium SVN o nazwie project -wc, więc przejdź do niego i edytuj czasy zatwierdzenia:
Wprowadź poprawną datę i godzinę (zwróć uwagę na strefy czasowe!) I oszczędzaj. Powinien zostać wyświetlony komunikat „Ustaw nową wartość dla właściwości svn: data w wersji 1”.
Teraz spłucz i powtórz dla każdej innej wersji.
Opcjonalnie sprawdź historię zatwierdzeń, aby upewnić się, że wszystko wygląda OK:
Następnie wróć o jeden poziom wyżej:
Zrzuć repozytorium:
I załaduj zrzut na swoim serwerze Subversion. Gotowy!
Ten proces prawdopodobnie działałby również bezpośrednio między zdalnymi repozytoriami, ale łatwiej mi było pracować z lokalnymi. Naprawianie czasów zatwierdzania było dużym nakładem pracy, ale ogólnie proces był znacznie prostszy niż w przypadku każdej innej metody, którą znalazłem.
źródło
istnieją trzy metody :
rebase : jak inne odpowiedzi
commit id: znajdź svn first commit id i git first commit id, echo ich do .git / info / grafts:
echo "git_id svn_id}" > .git/info/grafts
następniegit svn dcommit
kasy każde zatwierdzenie git, skopiuj pliki do svn_repo, svn commit
demo bash dem demo github
v1.x : użyj rebase i zatwierdzenia id
v2.x: użyj kopiowania plików, a następnie svn commit
źródło
W moim przypadku musiałem zainicjować czysty projekt z SVN
dodaj wszystkie źródła projektu ...
źródło
Chcę tylko podzielić się niektórymi doświadczeniami z zaakceptowaną odpowiedzią. Zrobiłem wszystkie kroki i wszystko było w porządku, zanim wykonałem ostatni krok:
Znalazłem wątek https://github.com/nirvdrum/svn2git/issues/50 i wreszcie rozwiązanie, które zastosowałem w następującym pliku w linii 101 /usr/lib/perl5/vendor_perl/5.22/Git/SVN.pm
Wymieniłem
z
To naprawiło mój problem.
źródło
Co jeśli nie chcesz zatwierdzać każdego zatwierdzenia dokonanego w Git do repozytorium SVN? Co jeśli chcesz tylko selektywnie wysyłać zatwierdzenia potoku? Cóż, mam lepsze rozwiązanie.
Mam jedno lokalne repozytorium Git, w którym wszystko, co kiedykolwiek robię, to pobieranie i łączenie z SVN. W ten sposób mogę się upewnić, że uwzględniam wszystkie te same zmiany co SVN, ale całkowicie trzymam moją historię zatwierdzeń od SVN.
Następnie przechowuję osobną lokalną kopię roboczą SVN, która znajduje się w osobnym folderze. Właśnie z tego robię zatwierdza z powrotem do SVN i po prostu używam do tego narzędzia wiersza poleceń SVN.
Kiedy jestem gotowy, aby przekazać stan mojego lokalnego repozytorium Git do SVN, po prostu kopiuję cały bałagan plików do lokalnej kopii roboczej SVN i stamtąd zatwierdzam go za pomocą SVN zamiast Git.
W ten sposób nigdy nie muszę robić żadnego bazowania, ponieważ bazowanie jest jak freebasing.
źródło