2009-05-22 24 views
7

Empecé a usar git-svn para algunos de mis trabajos para poder realizar confirmaciones locales. Esto funciona muy bien para proyectos que usan el diseño estándar de svn. Recientemente comencé a trabajar en un proyecto de Java que está dividido en varios módulos conectados (20-25), y cada módulo tiene su propia carpeta raíz en el mismo repositorio svn con su propio tronco/ramas/etiquetas.¿Cuántos proyectos svn en un repositorio git?

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

He clonado todos y cada módulo con el clon git svn -s/ruta/a/svnrepo/módulo [1-N]. El "problema" es que cuando quiero hacer git svn rebase en todos los módulos, tengo que hacerlo N veces.

He intentado hacer git svn clone/ruta/a/svnrepo/do evitar hacer la operación de rebase N veces, pero eso me deja con un diseño de directorio que es el mismo que en el repositorio svn.

¿Hay alguna manera de que pueda rastrear todos los troncos de todos los módulos en un repositorio de git? De modo que consiga una estructura de directorios como esto dentro de mi repositorio git:

module-1 
module-2 
module-N 
+0

miradas como un duplicado de http://stackoverflow.com/questions/279144/clone-multiple-svn-projects-with-git-svn – Wernight

+0

Esta otra pregunta no trata de fusionar los proyectos svn en el mismo repositorio git. –

Respuesta

2

Por desgracia, no, no hay manera de hacer esto. Un problema es que no hay nada que evite que dos o más módulos tengan una rama con el mismo nombre. Luego, en git-svn, cuando le das el nombre de la rama, ¿cómo sabría de qué módulo estás hablando?

Este problema realmente se debe al hecho de que en Subversion las ramas no son un concepto de primera clase, mientras que en git sí lo son. git-svn puede usar más o menos un kludge para evitar este hecho, pero el kludge se rompe si el repositorio tiene un diseño "no estándar" (como el que está trabajando).

Mi sugerencia: escribir una secuencia de comandos a git-svn rebase todos.

+2

Creo que su diseño es estándar. – IttayD

+0

Además, ¿cuál es el problema?Tendrá dos mandos a distancia, uno llamado módulo-1 y el otro módulo-2, luego las ramas serán module-1/somebranch y module-2/somebranch – IttayD

+0

@IttayD: No, no creo que sea un diseño estándar. En el diseño estándar que git-svn espera, solo hay un tronco, una etiqueta y una ramificación. Su diseño tiene N de cada uno. En segundo lugar, al clonar todo el repositorio SVN, cada módulo no se convierte en un control remoto. Entonces, el problema es exactamente como él dice que es: obtiene un único repositorio Git que refleja exactamente la estructura del directorio SVN. –

0

Me encontré en el mismo problema que usted, y descubrí que no hay una forma estándar de hacerlo. Sin embargo, al mirar alrededor descubrí una estrategia para ayudarme a hacer esto, y creé un script de Power Shell basado en eso. No recuerdo la fuente, o les daría crédito. Yo lo explicaría, pero es más fácil simplemente ver el guión y los comentarios.

Puede usar esta secuencia de comandos, o si no usa Windows/powershell, realice la creación basándose en ella. Lo bueno es que una vez que tienes tus repositorios git individuales para cada submódulo, si algo falla, es realmente rápido/fácil simplemente eliminar el nuevo repositorio "principal" de git, hacer cambios en el script y simplemente ejecutarlo de nuevo, ya que es todo local.

Tenga en cuenta que hay algunos casos que no se manejan, como tener cuando un submódulo tiene una carpeta que se llama igual que otro submódulo (por lo tanto, si tiene un submódulo llamado BIN y luego otros submódulos tienen sub una subcarpeta BIN, fallará). ¡También asegúrese de que todos los sub repositorios git de sus Módulos estén actualizados antes de comenzar!

Se puede extraer de la secuencia de comandos en este GIST: Gist Script

si por alguna razón la esencia está abajo, También he añadido aquí (aunque mucho menos legible)

$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; 
    } 
Cuestiones relacionadas