2010-03-22 19 views
51

Después de clonar un repositorio SVN usando git-svn con la opción -s (git svn clone http://server/repo -s), ¿cómo se crea una rama o etiqueta y se ha enviado al directorio de rama/etiqueta relevante en el repositorio cuando dcommit ing?Git-svn: crear y empujar una nueva rama/etiqueta?

Por ejemplo; si tuviera que usar git para crear una sucursal foobar localmente (git checkout -b foobar) ¿cómo puedo tener git-svn crear la rama en el servidor (http://server/repo/branches/foobar)?

Estoy usando Git 1.5.5.6.


Por favor Nota:

El método aceptado por debajo no funciona con Git 1.5.5.6 ya que no hay git svn branch método. Todavía estoy buscando una solución a esto que no implique resolver trabajar directamente con svn.

Respuesta

71

Puede leer todos los detalles esenciales en este tutorial, pero la esencia es básicamente el siguiente:

$ git svn branch -m "Topic branch" my_topic   # Create SVN branch called "my_topic" 
$ git checkout --track -b my-topic remotes/my_topic # Create the Git branch for "my_topic" 
# Hack hack hack... 
$ git svn dcommit --dry-run # Make sure you're committing to the right SVN branch 
$ git svn dcommit    # Commit changes to "my_topic" branch in SVN 
+0

Este ** no ** funciona con mi versión git de 1.5.5.6 - no existe tal comando 'git svn branch'. –

+9

'git svn branch' se agregó en v1.6.1. Recomiendo actualizar, ya que 1.5.5.6 tiene aproximadamente un año y medio. – mipadi

+0

cómo usarlo con la etiqueta svn. Creé la etiqueta svn con la etiqueta 'git svn tag -m 'tag description" 0.0.2'. Y ahora me gustaría establecer una etiqueta apropiada en git. ¿Cómo debería hacer esto? Gracias – yas375

0

Sólo quería señalar que no se debe rebasar en su rama recientemente creado a partir de cosas que ya tienes en una rama de git diferente. git svn dcommit luego empujará hacia el tronco, parece. Al menos eso fue un problema para mí.

En su lugar, si desea extraer los cambios de una antigua rama git en esta nueva rama svn, use p. Ej. cherry-pick.

+0

Acabo de probar esto (fusionar old_branch en new_svn_branch, luego dcommit) y se ha comprometido con la rama SVN correcta (no troncal). Usando msysgit 1.7.9. – florisla

+0

Lo que quise decir es que si tiene branch1 y branch2 en git, quiere hacer una nueva branch1 en svn, y luego en git branch1 rebase desde branch2. Compromiso después de eso irá al maletero (hice por mí). Puede ser que con la sugerencia de @ pestrella esto no sea un problema. Y en cualquier caso, es menor. – yngve

48

Si ha creado su filial local antes de que existiera la rama subversión y ahora quiere empujar a su rama local en una rama de la subversión, puede hacer lo siguiente:

Crear la rama SVN de la revisión que creó su rama local

 
    $ svn cp http://svn-repo/my_app/[email protected] http://svn-repo/my_app/branches/feature1 

Fetch la nueva rama sVN para que su repositorio git lo sabe

 
    $ git svn fetch 

la rama sVN debe ahora se agregará como un control remoto en su git repo

 
    $ git branch -a 
    * feature1 
     master 
     remotes/feature1 

En este punto, su control remoto seguirá estando en el maletero. Debe señalar su sucursal local a la nueva sucursal remota. Usted puede hacer esto mediante rebase su sucursal local de la rama remota:

 
    $ git rebase remotes/feature1 

Ahora que su rama local se refiere a su oficina remota, puede confirmar los cambios en la misma.En primer lugar hacer un simulacro por lo que se tiene la certeza de que los cambios entrarán en su sucursal remota:

 
    $ git svn dcommit --dry-run 
    Commiting to http://svn-repo/my_app/branches/feature1 

Ahora se puede confirmar cambios a su sucursal remota

 
    $ git svn dcommit 

más cómo-tos le dirá a Subversión de rama primero y luego crear una rama local que rastrea la rama remota. Pero a menudo no decido de antemano si mi sucursal local debe rastrear una sucursal remota. A menudo me ramifico localmente y hago cambios sin la intención de empujar a una sucursal remota. Si luego decido comprometer mi sucursal local en una sucursal remota, realizo los pasos anteriores.

+1

¡Excelente! ¡Exactamente! –

+2

@unpluggd: Creo que esta debería ser la respuesta aceptada porque en realidad responde a la pregunta. Es decir, a menos que la respuesta aceptada suponga que se ha creado y pirateado una rama local antes de escribir esos comandos. –

+0

No veo la nueva rama al ejecutar 'git svn fetch' – SnapDragon

Cuestiones relacionadas