Jak git-svn sklonować ostatnie n wersji z repozytorium Subversion?


314

Problem

Jak tworzysz płytką kopię za pomocą git-svn z repozytorium Subversion, np. Jak wyciągasz tylko trzy ostatnie wersje?

git clonePolecenie może dostać ostatnie n wersje z repozytorium Git przypadku korzystania z opcji --depth, tj masz płytkie kopię repozytorium. Przykład:

git clone --depth 3 git://some/repo myshallowcopyrepo

Czy istnieje podobna opcja dla git-svn?

Moje dotychczasowe odkrycia

Do tej pory znalazłem tylko -rNopcję, w której Nmożna pobrać wersję. Przykład:

git svn clone -rN svn://some/repo

Zgodnie z dokumentacją istnieje możliwość korzystania -r$REVNUMBER:HEAD. Wypróbowałem następujące, aby uzyskać ostatnie 3 wersje, które zwróciły komunikat o błędzie.

$ git svn clone --prefix=svn/ -s -rHEAD~3:HEAD http://some/svn/repo .
revision argument: HEAD~3:HEAD not understood by git-svn

Zastąpiłem HEAD~3więc faktyczną liczbą trzeciej, ale ostatniej wersji 534. To zadziałało, ale to wymaga ode mnie, aby najpierw ustalić numer wersji trzeciego, ale ostatniego zatwierdzenia.

$ git svn clone --prefix=svn/ -s -r534:HEAD http://some/svn/repo .

Dokumentacja

git-klon

git-svn


6
Odpowiadając na moje pytanie: -s is for --stdlayout which presumes the svn recommended layout for tags, trunk, and branches.(ale nie zadziałało dla mnie)
Sebastián Grignoli

Jak trudno byłoby wdrożyć --depthza git svn, ponieważ wsparcie jest już tam. I musi już znaleźć najnowszą wersję z serwera?
Peter Cordes

Odpowiedzi:


238

Odkryłeś już najprostszy sposób określenia płytkiego klonu w Git-SVN, określając numer wersji SVN, od którego chcesz rozpocząć klonowanie ( -r$REV:HEAD).

Na przykład: git svn clone -s -r1450:HEAD some/svn/repo

Struktura danych Git opiera się na wskaźnikach na ukierunkowanym wykresie acyklicznym (DAG), co sprawia, że ​​powrót nzatwierdzeń jest banalny . Ale w SVN (a zatem w Git-SVN) musisz sam znaleźć numer wersji.


5
co jeśli chciałbym kontynuować klonowanie wcześniejszej wersji w przyszłości, czy jest to możliwe?
Zennichimaro,

5
@Zennichimaro: Możesz to zrobić, dodając kolejny git-svnpilot wskazujący w tym samym miejscu i używając, git-svn fetchaby uzyskać więcej drzewa. W tym momencie musisz użyć git filter-branchdo odtworzenia starego (częściowego) drzewa na prawej gałęzi.
Ben Jackson,

Paul ma dla mnie jakikolwiek sposób na uzyskanie najnowszych wersji, wykonując Migrację przyrostową z SVN do Git ( stackoverflow.com/questions/29161646/... )
SabareeshSS

1
SVN używa kolejnych liczb całkowitych do identyfikowania poprawek, co sprawia, że ​​jeszcze bardziej trywialne jest wycofywanie nzatwierdzeń ...
harmic

Myślę, że po -r brakuje miejsca. Na przykład git svn clone -r 1133: HEAD some / svn / repo
Gnana

92

Często używam następujących opcji, aby uzyskać ograniczoną liczbę poprawek z naszego ogromnego drzewa subversion (wkrótce osiągamy wersję svn 35000).

# checkout a specific revision
git svn clone -r N svn://some/repo/branch/some-branch
# enter it and get all commits since revision 'N'
cd some-branch
git svn rebase

Dobrym sposobem, aby dowiedzieć się, gdzie powstała gałąź, jest zrobienie svn logtego i znalezienie pierwszego w gałęzi (ostatniego wymienionego podczas wykonywania):

svn log --stop-on-copy svn://some/repo/branch/some-branch

Do tej pory tak naprawdę nie uważałem, że warto było śledzić wszystkie gałęzie. Sklonowanie, svn i git nie działają razem tak dobrze, jak bym chciał. Zwykle tworzę pliki łatek i stosuję je na klonie git innej gałęzi svn.


1
+1 ode mnie - pomogło mi obejść problem z błędem 128 Klonowałem całe repozytorium svn
Ian Oxley

polecenie svn log było dokładnie tym, czego szukałem! dzięki
mrbrdo

1
Repo, z którymi pracuję, ma niestandardowe rozgałęzienia i układ, dlatego generalnie tworzę lokalne repozytorium Git dla każdej gałęzi SVN, a następnie cherry-pick/ rebasemiędzy nimi. Zatwierdź robi dodatkowy krok ( pushnastępnie dcommitzdalne repo), ale myślę, że warto go wymienić.
chronospoon

Nie zastanawiałem się nad tym, może być szybsze klonowanie określonych tagów / gałęzi, jak mówisz :)
VeenarM

33

... 7 lat później na pustyni wieje tumana przez ...

Nie byłem zadowolony z zaakceptowanej odpowiedzi, dlatego stworzyłem dla Ciebie kilka skryptów dostępnych na Github . Powinny one pomóc każdemu, kto chce użyć, git svn cloneale nie chce sklonować całego repozytorium i nie chce szukać konkretnej wersji w celu sklonowania w środku historii (być może klonujesz kilka repozytoriów). Tutaj możemy po prostu sklonować ostatnie N wersji:

Służy git svn clonedo klonowania ostatnich 50 wersji

# -u    The SVN URL to clone
# -l    The limit of revisions
# -o    The output directory

./git-svn-cloneback.sh -u https://server/project/trunk -l 50 -o myproj --authors-file=svn-authors.txt

Znajdź poprzednią wersję N z repozytorium SVN

# -u    The SVN URL to clone
# -l    The limit of revisions

./svn-lookback.sh -u https://server/project/trunk -l 5     

To sprawi, że nasze repozytorium będzie zawierało około 170 000 wersji, a wykonanie jednego projektu zajmuje zbyt długo, a ja mam ponad 10 konkretnych projektów w repozytorium: | Zastanawiam się nad zrobieniem tylko 3-4 lat historii.
VeenarM

1
Dziękujemy za udostępnienie tego!
Kai Mechel,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.