2009-05-22 13 views
7

Zacząłem używać git-svn do niektórych moich prac, aby móc wykonywać lokalne zatwierdzenia. Działa to doskonale w przypadku projektów korzystających ze standardowego układu svn. Ostatnio rozpocząłem pracę nad projektem Java, który jest podzielony na wiele połączonych modułów (20-25), a każdy moduł ma swój własny folder główny w tym samym repozytorium svn z własnym drzewem/gałęziami/znacznikami.Wiele projektów svn w jednym repozytorium git?

svnrepo/  
    module-1 
    trunk 
    branches 
    tags 
    module-N 
    trunk 
    branches 
    tags 

I sklonowano każdy moduł git svn klonu -s/ścieżka/do/svnrepo/modułu, [1, N]. "Problem" polega na tym, że kiedy chcę wykonać repozytorium git svn na wszystkich modułach, muszę to zrobić N razy.

Próbowałem wykonać polecenie git svn clone/path/to/svnrepo /, unikając wykonywania operacji Nb razy, ale to pozostawia mi układ katalogu, który jest taki sam jak w repozytorium svn.

Czy istnieje sposób, że mogę śledzić wszystkie pnie wszystkich modułów w jednym reporze git? Aby uzyskać taki układ katalogów w moim repozytorium git:

module-1 
module-2 
module-N 
+0

wyglądów jak duplikat http://stackoverflow.com/questions/279144/clone-multiple-svn-projects-with-git-svn – Wernight

+0

To drugie pytanie nie dotyczy scalania projektów svn w tym samym repozytorium git. –

Odpowiedz

2

Niestety nie, nie ma sposobu, aby to zrobić. Jednym z problemów jest to, że nic nie stoi na przeszkodzie, aby dwa lub więcej modułów posiadało oddział o tej samej nazwie. Następnie, w git-svn, kiedy podasz nazwę oddziału, w jaki sposób będzie on wiedział, o którym module mówisz?

Ten problem wynika z faktu, że w gałęziach Subversion nie są to pojęcia pierwszej klasy, podczas gdy w git są. git-svn jest w stanie użyć mniej lub bardziej kludu do obejścia tego faktu, ale kludge psuje się, jeśli repo ma "niestandardowy" układ (taki jak ten, z którym pracujesz).

Moja sugestia: napisz scenariusz do git-svn rebase je wszystkie.

+2

Myślę, że jego układ jest standardowy. – IttayD

+0

Ponadto, w czym problem?Będzie miał dwa piloty, jeden nazwany moduł-1, drugi moduł-2, a następnie gałęzie to moduł-1/jakaś gałąź i moduł-2/jakaś gałąź – IttayD

+0

@IttayD: Nie, nie sądzę, że jest to standardowy układ. W standardowym układzie, którego oczekuje git-svn, istnieje tylko jeden trunk, jeden tag i jeden oddział. Jego układ ma N każdego z nich. Po drugie, podczas klonowania całego repozytorium SVN, każdy moduł nie staje się zdalnym. Tak więc problem jest dokładnie taki, jak sam to określa: otrzymuje pojedyncze repozytorium Git, które odzwierciedla dokładnie strukturę katalogów SVN. –

0

Znalazłem się w tej samej sprawie jak ty i odkryłem, że nie ma standardowego sposobu, aby to zrobić. Jednakże, rozglądając się, dowiedziałem się o strategii, która pomogłaby mi to zrobić, i stworzyłem na tej podstawie skrypt Power Shell. Nie pamiętam źródła, lub dałbym im kredyt. Chciałbym to wyjaśnić, ale łatwiej mi jest zobaczyć scenariusz i komentarze.

Możesz użyć tego skryptu, lub jeśli nie używasz windows/powershell, możesz na nim bazować. Dobrą rzeczą jest to, że gdy masz już swoje indywidualne repozytorium git dla każdego modułu, jeśli coś się nie powiedzie, to naprawdę szybko/łatwo po prostu usuniesz nowe "master" repozytorium git, dokonaj zmian w skrypcie i po prostu uruchom go ponownie, ponieważ to wszystko lokalny.

Pamiętaj, że istnieją pewne przypadki, które nie są obsługiwane, np. Gdy moduł podrzędny ma folder, który jest nazywany tym samym, co inny moduł podrzędny (więc jeśli masz moduł podrzędny o nazwie BIN, a następnie masz inne sub-moduły podfolder BIN, to się nie powiedzie). Upewnij się także, że wszystkie sub-moduły repozytoriów git są aktualne, zanim zaczniesz!

Możesz sprawdzić skrypt w tym GIST: Gist Script

jeśli z jakiegoś powodu istota jest w dół, Dodałem także tutaj (choć dużo mniej czytelny)

$GitReposLocation = "path\to\individual\git\repos"; #1 git repo for each module (you svn cloned each one using std layout) 
$MasterGitRepoLocation = "path\to\masterRepo"; #the path where you want your main repo that contains all the modules 
git reset --hard; 

write-host Creating folder $MasterGitRepoLocation -foregroundcolor "green"; 
mkdir $MasterGitRepoLocation; 

write-host Moving to folder $MasterGitRepoLocation -foregroundcolor "green"; 
cd $MasterGitRepoLocation; 

write-host Creating Git Repository -foregroundcolor "cyan"; 
git init; 

#this is hacky, but we need to have an initial commit 
"" > root; 
git add root; 
write-host Creating root node -foregroundcolor "cyan"; 
git commit -m "Initial commit to create parent root."; 

#we are going to be moving files around, and don't want to move the files we already got in our MasterRepo root/workspace 
$NotMoveThesFiles = @(); 
dir |%{[email protected]($_.FullName) }; 

$repos = @(); 
# you should add a repo here if for some reasong you don't want to process that one. 
# [email protected]("SomeRepo"); 

dir -Path $GitReposLocation -Directory |Where-object{ $repos -NotContains $_.Name }|%{[email protected]($_.Name) }; 

# for-each repo.... 
$repos|%{ 
     $SubRepoName = $_; 
     write-host Processing GitRepo $SubRepoName -foregroundcolor "green";   
     $Remote = "remote"+$SubRepoName;   

     #add this git repo (of a module) as a remote of our main repo 
     write-host Adding reference to $SubRepoName as remote repo -foregroundcolor "cyan"; 
     git remote add -f $Remote $GitReposLocation\$SubRepoName; 

     #Merge that sub repo into the main repo. The only problem? It will copy that repo's workspace 
     #directly into our main repo Root folder 
     write-host Merging remote$SubRepoName/master into master -foregroundcolor "cyan"; 
     git merge remote$SubRepoName/master; 

     #so now we are going to create a folder with the name of this module (subRepo) 
     #and move everything that is in the Master's root folder to that folder, except of course 
     #things that we already had in the root folder before the merge. (in the NotMoveTheseFiles array) 

     write-host Moving files got from $SubRepoName to a subdir called $SubRepoName -foregroundcolor "green"; 

     #create folder folr the module 
     mkdir $SubRepoName; 
     #add these new folde to the list of things we don't want to move into it. 
     [email protected]($SubRepoName); 

     #copy all files not in the NotMoveTheseFiles array into the newly created folder. 
     dir |where-object {$NotMoveThesFiles -NotContains $_} |%{git mv $_ $SubRepoName}; 

     #commit the change where we moved all these files around. 
     $CommitMessage = "Moving files got from " + $SubRepoName + " to a subdir called $SubRepoName" 
     git commit -m $CommitMessage; 
    } 
Powiązane problemy