Czy możliwe jest posiadanie repozytorium Subversion jako modułu podrzędnego Git?

154

Czy istnieje sposób na dodanie repozytorium Subversion jako modułu podrzędnego Git w moim repozytorium Git?

Coś jak:

git-svn submodule add https://svn.foo.com/svn/proj --stdlayout svn-project

Gdzie https://svn.foo.com/svn/projwskazuje na repozytorium Subversion.

Wiem, że jest to, git-svnco pozwala na interakcję z repozytorium Subversion. Tak więc myślę, może istnieje sposób na pobranie repozytorium Subversion za pomocą, git-svna następnie użycie go jako modułu podrzędnego.

davitenio
źródło

Odpowiedzi:

127

Nie. Najlepszym rozwiązaniem byłoby utworzenie kopii lustrzanej repozytorium svn w dedykowanym repozytorium git.

git svn clone -s http://subversion.example.com/ mysvnclone
cd mysvnclone
git remote add origin [email protected]:project.git
git push origin master

Następnie możesz dodać repozytorium git jako podmoduł do oryginalnego projektu

cd /path/to/gitproject
git submodule add git://example.com/project.git -- svn-project
git add svn-project
git commit -m "Add submodule"

Istnieje jedna różnica pojęciowa między svn: externals a podmodułem git, która może cię zaskoczyć, jeśli podejdziesz do tego z subwersyjnego punktu widzenia. Podmoduł git jest powiązany z wersją, którą mu podasz. Jeśli „upstream” się zmieni, musisz zaktualizować odniesienie do modułu podrzędnego.

Więc kiedy ponownie zsynchronizujemy z wyższą wersją podrzędną:

cd /path/to/mysvnclone
git svn rebase
git push

... projekt git będzie nadal używał oryginalnej wersji, którą wcześniej zatwierdziliśmy. Aby zaktualizować do svn HEAD, musisz użyć

cd /path/to/gitproject/svn-project
git checkout master
git pull
cd ..
git add svn-project
git commit -m"Update submodule"
richq
źródło
1
Czy wypróbowałeś te kody przed wysłaniem ich tutaj? moduły podrzędne nie mogą działać poprawnie na git svn.
xhan
4
@xhan tak, i nie jestem zwolennikiem mieszania git-svn i submodułów w tym samym repozytorium. Klon korzystający z git-svn jest tylko pomostem do stworzenia natywnego klonu git repozytorium svn.
Richq
Przepraszam. Nie stwierdziłem, że używasz dwóch folderów do działania jako podmoduły. niezła sztuczka.
xhan
Niezła technika. Czy nie potrzebujesz kroku „git init --bare” na serwerze przed umieszczeniem tam repozytorium git-svn? Musiałem to zrobić.
Clayton Stanley,
Prawdopodobnie nie jest to ustawienie domyślne, ale możesz powiązać svn: externals z konkretną wersją, tak jak robią to moduły podrzędne git.
MarcH
8

Właśnie przez to przeszedłem. Robię coś podobnego do rq, ale trochę inaczej. Skonfigurowałem jeden z moich serwerów do obsługi tych klonów git repozytoriów svn, których potrzebuję. W moim przypadku chcę tylko wersje tylko do odczytu i potrzebuję czystego repozytorium na serwerze.

Na serwerze, który uruchamiam:

GIT_DIR=<projectname>.git git init
cd <projectname>.git/
GIT_DIR=. git svn init svn://example.com/trunk
GIT_DIR=. git svn fetch
git gc

To konfiguruje moje gołe repozytorium, a następnie mam skrypt cron, aby go zaktualizować:

#!/usr/bin/python

import os, glob

GIT_HOME='/var/www/git'

os.chdir(GIT_HOME)
os.environ['GIT_DIR']='.'
gits = glob.glob('*.git')
for git in gits:
  if not os.path.isdir(git):
    continue
  os.chdir(os.path.join(GIT_HOME, git))
  if not os.path.isdir('svn/git-svn'):
    #Not a git-svn repo
    continue

  #Pull in svn updates
  os.system('git svn fetch && git gc --quiet')
  #fix-svn-refs.sh makes all the svn branches/tags pullable
  os.system('fix-svn-refs.sh')
  #Update the master branch
  os.system('git fetch . +svn/git-svn:master && git gc --quiet')`

Wymaga to również fix-svn-refs.sh z http://www.shatow.net/fix-svn-refs.sh Inspiracją była głównie: http://gsocblog.jsharpe.net/archives/12

Nie jestem pewien, dlaczego git gcjest tu potrzebny, ale nie mogłem się git pullbez niego obejść.

Więc po tym wszystkim możesz użyć podmodułu git zgodnie z instrukcjami rq.

Sherbang
źródło
Można by pomyśleć, że możesz to zrobić nawet jako hak do zmiany.
Andres Jaan Tack
6

Obecnie git-svn nie obsługuje svn: externals . Ale są jeszcze dwa inne narzędzia, które mogą Ci pomóc:

  1. SubGit

    SubGit jest rozwiązaniem po stronie serwera, umożliwia dostęp Git do repozytorium Subversion i odwrotnie. Możesz zapoznać się z dokumentacją, aby uzyskać więcej informacji, ale ogólnie jest dość łatwy w użyciu SubGit:

    $ subgit configure --layout auto $SVN_URL $GIT_REPO
    

    Powyższe polecenie wykryje układ gałęzi w projekcie SVN, a następnie utworzy puste repozytorium Git gotowe do odzwierciedlenia projektu SVN. Możesz zostać poproszony o podanie poświadczeń, chyba że są one już zapisane w pamięci podręcznej poświadczeń SVN w katalogu ~ / .subversion. Możesz także dostosować $GIT_REPO/subgit/authors.txtmapowanie nazwisk autorów SVN do tożsamości Git.

    $ subgit install $GIT_REPO
    $ ... let initial translation complete ... 
    $ TRANSLATION SUCCESSFUL
    

    W tej chwili masz repozytorium Subversion podłączone do nowo utworzonego repozytorium Git. SubGit tłumaczy wersję SVN na zatwierdzenie Git na każdym, svn commita zatwierdzenie Git na wersję SVN na każdym git push.

Wszystko, czego potrzebujesz dalej, to udostępnienie repozytorium Git autorom. W tym celu spójrz na git-http-backend . Następnie możesz dodać utworzone repozytorium Git jako zwykły moduł podrzędny. SubGit jest również dostępny jako dodatek do serwera Bitbucket. Więcej informacji można znaleźć tutaj . Nie ma więc potrzeby używania żadnych zewnętrznych narzędzi, takich jak git-svn lub inne.

SubGit jest oprogramowaniem zastrzeżonym, ale jest bezpłatne dla małych firm (do 10 osób zaangażowanych), projektów akademickich i projektów open source.

  1. SmartGit

    SmartGit zastępuje git-svn po stronie klienta. Więcej informacji na temat jego funkcji można znaleźć tutaj .

    W szczególności SmartGit obsługuje zarówno moduły podrzędne git, jak i svn: zewnętrzne , możesz je mieszać w swoim repozytorium.

    SmartGit jest oprogramowaniem zastrzeżonym, ale jest bezpłatne do użytku niekomercyjnego.

vadishev
źródło
Zarówno subgit( subgit.com/documentation/ ... ), jak i smartgitobsługiwane są svn:externalsw ten sam sposób przez jawny .gitsvnextmodulesplik w kopii roboczej. Oznacza to, że nadal musisz używać tego oprogramowania do pobierania zewnętrznych elementów i nie możesz używać podstawowego gitnarzędzia do pobierania tych zewnętrznych bezpośrednio z zewnętrznego serwera git hub, takiego jak githublub gitlab. Tak więc źródła udostępnione snv:externalsna zewnętrznym serwerze git hub nie będą widoczne i możliwe do pobrania bez tego oprogramowania, co nadal stanowi poważny problem.
Andry
4

Oprócz tego, co powiedział rq, inną metodą byłoby użycie projektu „externals” innej firmy ( http://nopugs.com/ext-tutorial ), który lepiej naśladuje działanie zewnętrznych odniesień svn. Dzięki zewnętrznym możesz śledzić repozytoria git lub svn i wydaje się łatwiejsze, aby wprowadzić zmiany do tych repozytoriów. Jednak wymaga od członków projektu pobrania i zainstalowania oddzielnego pakietu.

Nie korzystałem jeszcze z modułów podrzędnych ani zewnętrznych; jednak spędziłem kilka godzin na czytaniu o wszystkich alternatywach i wygląda na to, że zewnętrzne będą lepiej pasować do moich potrzeb. Doskonała dyskusja na temat tych i innych niestandardowych metod znajduje się w rozdziale 15 książki „Kontrola wersji za pomocą Git” autorstwa Jona Loeligera ( http://oreilly.com/catalog/9780596520120 ), którą gorąco polecam.

pcuenca
źródło
0

Piston jest przepisywany, aby obsługiwać to i odwrotnie, a także istniejący adres URL Subversion w repoistorii Subvresion i git + git.

Sprawdź repozytorium tłoków na Githubie .

Niestety wydaje się, że nie został wydany.

Otto
źródło
3
Jednak tłok zawiedzie ci w twarz, gdy będziesz go najbardziej potrzebować;), więc nie polecam tego. Poza tym nie ma już żadnych poprawek dla tłoka.
Henrik
0

Cóż, jest git-remote-testsvn, więc chyba coś takiego

git submodule add testsvn::http://www.telegraphics.com.au/svn/bzquips/trunk/ \
    module/bzquips

powinno działać. Czy to?

mcepl
źródło