2009-10-28 23 views
20

Nuestro repositorio de subversión de la compañía es un poco complicado: tenemos un diseño básico "predeterminado" con tronco, etiquetas y ramas. Sin embargo, dentro de las sucursales, tenemos un directorio de "trabajo" que contiene más sucursales. Algo como esto:Git-SVN con múltiples sucursales?

  • ramas/release_1_0_x
  • ramas/release_1_1_x
  • ramas/trabajo/Dave/topic_one
  • ramas/trabajo/tom/topic_two
  • ramas/trabajo/something_else

Ahora, ¿cómo puedo obtener git-svn para reconocer todos esos (y algunos más) como ramas separadas? Parece que git svn init solo acepta una ubicación de sucursal, como quiera que la invoque.

Editar: así es como me inicializa el repositorio git:

git svn clone -s --prefix=svn/ http://svn.company.com/product/ 

Respuesta

9

De acuerdo con la respuesta a another question, lo mejor es usar Git 1.6.x y tomar ventaja de "clonación profunda".

Si no puede actualizar a 1.6.x, puede especificar varias ramas al clonar.

git svn clone -s --prefix=svn/ -b branches -b branches/work/dave -b branches/work/tom ... 

Usted sólo tiene que asegurarse de agregar información para los nuevos usuarios a su .git/config antes "svn git fetch" ing cuando se ha añadido una nueva rama de usuario.

+0

Esto es de hecho exactamente lo que necesito. ¡Gracias por el enlace! –

+4

¿Cómo es que esto hace que se vea tu archivo .git/config, ya que estoy usando git 1.7 y me gustaría hacerlo retroactivamente? – whaley

+0

He intentado esto, pero también tiene una rama llamada "trabajo". ¿Hay alguna manera de hacer que la cosa "trabajo" no sea su propia sucursal sino que sea "trabajo/algo_ello"? Posiblemente con --ignore-paths? –

11

Para aquellos que buscan hacer esto de manera retroactiva, la git-svn manpage for 1.7.x dice:

También es posible acceder a un subconjunto de ramas o etiquetas mediante el uso de una lista separada por comas de nombres dentro de tirantes. Por ejemplo:

[svn-remote "huge-project"] 
    url = http://server.org/svn 
    fetch = trunk/src:refs/remotes/trunk 
    branches = branches/{red,green}/src:refs/remotes/branches/* 
    tags = tags/{1.0,2.0}/src:refs/remotes/tags/* 
+0

¡Gracias! En mi caso, no pude hacer clonar así, pero cloné, edité .git/config para agregar las ramas como se enumeran y reran 'git svn fetch'. Ahora 'git branch -a' o' git branch -r' muestran las ramas - woot! – sage

28

Puede agregar varias ramas y las entradas de etiquetas en su configuración git-svn, incluso con carácter retroactivo. Así que si normalmente ramas SVN vivir en branches/* en su repositorio SVN (. Es decir, una disposición estándar), pero también hay branches/summer-students/*, puede configurarlo en .git/config, como a continuación:

[svn-remote "svn"] 
    url = svn+ssh://svn.example.com 
    fetch = trunk:refs/remotes/trunk 
    branches = branches/*:refs/remotes/* 
    tags = tags/*:refs/remotes/tags/* 

    branches = branches/summer-students/*:refs/remotes/svn-summer-students/* 

A la izquierda de la : es la ruta en el Repo SVN, y en el derecho es la ruta que aparecerá como en su lista de sucursales remotas git. Puedes usar refs/remotes/* repetidamente para que todo aparezca como una rama remota de nivel superior, pero ten cuidado con las colisiones de nombres: romperán cosas (por lo tanto, svn-summer-students en lugar de summer-students, que ya existe).

Después de editar la configuración, debe eliminar .git/svn/.metadata y ejecutar git svn fetch para actualizar la lista de ramas y regenerarla. git branch -r debería mostrar las ramas adicionales. Si obtiene errores, busque las colisiones de nombres.

El git svn docs tiene algunos ejemplos más de rutas de especificación a través de comodines o expresiones si tiene un diseño funky SVN.

+0

¡Un salvavidas que me ahorró 4 días de tiempo de recuperación! – prusswan

+0

¡Una buena explicación, funciona como un encanto! –

Cuestiones relacionadas