2010-12-13 22 views
9

Estoy enfrentando el problema de fusionar un subconjunto de revisiones de una rama de tema a otra. Como estoy usando git-svn, tenía curiosidad por ver si es posible usar el método de recolección de cerezas para esto. Usando Subversion, haría:escogiendo cereza con git-svn

svn merge -c A 
svn merge -c B 
svn merge -c C 
... 
svn commit ... 

¿Qué pasaría si trato de hacer esto?

git checkout branch1 
git cherry-pick A 
git cherry-pick B 
git cherry-pick C 
git svn dcommit 

Si leo la página de manual git svn, las respuestas es "no hagas eso", pero me da la impresión, cuando alrededor de google que svn git hace un trabajo mucho mejor ahora con este tipo de problemas .

Respuesta

8

Cuando ejecutas git svn dcommit, se ejecutará secuencialmente un svn commit por cada commit de git entre tu rama de seguimiento svn y lo que HEAD esté en git. En su ejemplo, son tres commits – uno para A, B y C – ya que git cherry-pick confirma los cambios de inmediato. De acuerdo, podría usar git rebase -i para aplastar esas confirmaciones juntas en una única revisión antes de ejecutar git svn dcommit para enviarlas a svn.

Al ejecutar git-svn se ignoran por completo todas las propiedades de svn:mergeinfo. Desde git-svn man page:

Ignoramos todas las propiedades de SVN excepto svn: ejecutable. Cualquier propiedad no controladas se registran en $GIT_DIR/svn/<refname>/unhandled.log

+0

Uso TortoiseSVN, así que no estoy seguro de cómo lo haría en la línea de comandos, pero recomendaría hacer lo que en Tortoise se conoce como Grabar la fusión, donde actualiza Mergeinfo, pero no crea ningún cambios reales en la confirmación. En teoría, esto evitaría más problemas si otras personas se fusionan dentro del contexto SVN, ya que esas revisiones ya se han "fusionado" y podrían causar un conflicto falso. –

1

No debería haber ningún problema con esto en absoluto; Ya he hecho esto muchas veces en el trabajo antes. Además, cuando TortoiseSVN ha tenido problemas para fusionar ramas enteras en el pasado, he recurrido a la redefinición de ramas de temas en la parte superior del tronco y aplastando todas las confirmaciones en una confirmación, que es similar en naturaleza a una selección inteligente. Ha funcionado muy bien.

+0

¿Pero git svn actualizará correctamente las propiedades de svn: mergeinfo para que las operaciones de fusión de subsecuencias hechas con svn merge "vean" las selecciones de cereza? – JesperE

+0

@JesperE: No. Por mi trabajo no me importa, porque svn: mergeinfo es un truco terrible, y uso Git para realizar fusiones de todos modos. :) – cdhowie

+0

Sí, svn: mergeinfo es un truco terrible, pero desafortunadamente no tengo ese lujo. Mis compañeros de trabajo se molestarían mucho si lo hiciera. – JesperE

9

-git svn tenía un problema grave relacionado con compromete palmitas:

Suponga que tiene cometer a1b2c3f9 que ya está dcommitted en el repositorio SVN:

$ git show a1b2c3f9 
    commit a1b2c3f9... 
    Author: Happy Dev <[email protected]> 
    Date: Mon Nov 14 13:01:38 2011 +0000 

    Commit message 

    git-svn-id: https://host/svn/branches/[email protected] 43fe5c0-... 

Ver este git-svn-id línea? Así es como git-svn entiende dónde se encuentra su confirmación en el repositorio de Subversion.

ahora quiere cereza-escoge esta confirmación a principal rama en la que está actualmente en:

$ git cherry-pick a1b2c3f9 

Si no hay conflictos de fusión, git crea un nuevo compromiso, por ejemplo, 9f3c2b1a y aquí lo que tenemos:

$ git show 9f3c2b1a 
    commit 9f3c2b1a... 
    Author: Happy Dev <[email protected]> 
    Date: Mon Nov 14 13:01:39 2011 +0000 

    Commit message 

    git-svn-id: https://host/svn/branches/[email protected] 43fe5c0-... 

Entonces, Git creó una confirmación con exactamente el mismo mensaje. Esto causó serios problemas. Las versiones anteriores de git-svn enviaron dicha confirmación a la rama incorrecta - ^/branches/some-branch en lugar de ^/trunk/.

Este problema ya está solucionado en las últimas versiones de Git. Pero hay otro que todavía está presente:

git-svn no respeta el mecanismo de seguimiento de fusión de Subversion.

que Subversion se fusionan información sobre cherry-picks realizados, por lo que el comando

$ svn merge -c 1000 ^/branches/some-branch trunk-working-copy 

ajusta el SVN : mergeinfo propiedad de tronco-copia de trabajo de la siguiente manera:

+ /branches/some-branch: 1000 

De esta forma, Subversion entiende que esta revisión en particular ya estaba fusionada en la rama ^/trunk/ por lo que se salta este chang e en otras fusiones.

Cuando se ejecuta git cherry-pick y luego git svn dcommit depósito de la subversión no consigue SVN: mergeinfo modificación.


Aquí va el descargo de responsabilidad:
Actualmente no trabajo en SmartGit pero trabajo en un estrecho contacto con los desarrolladores SmartGit.

Syntevo compañía desarrolló SmartGit - un gran reemplazo de git-svn. Este cliente Git resuelve todos los problemas que he descrito más arriba:

Por lo tanto, cereza-escoge a1b2c3f9 comprometen:

$ git cherry-pick a1b2c3f9 

como resultado que se obtiene 9f3c2b1a confirmación, y luego lo empuja hacia Repositorio Subversion. SmartGit hace todo lo posible para mantener la información de registro de fusiones, por lo ^/trunk/ rama obtiene necesaria modificación de su SVN: mergeinfo propiedad:

+ /branches/some-branch: 1000 

Se podrá realizar Git cereza recoger ya sea de sí mismo o mediante SmartGit Interfaz de línea de comando de Git. En el segundo caso, el mensaje de confirmación debe tener git-svn-id línea de la fuente de selección de cereza.

SmartGit es un software propietario, pero es gratuito para uso no comercial. Tiene muchas funciones excelentes, para obtener más información, consulte SmartGit documentation.

Hay otro proyecto interesante que resuelve ciertos problemas con git-svn - SubGit. Básicamente es la solución del lado del servidor para sincronizar los cambios entre los repositorios Subversion y Git. Es mucho más superior que git-svn y no tiene problemas.

Como usuario de svn-via-git, creo que a usted también le puede interesar.

+0

Gracias por la información. Suena prometedor. – JesperE

+0

> Es mucho más superior que git-svn y no tiene problemas. Esto se afirma en todas partes en el sitio web de SubGit, pero no puedo encontrar nada en detalle sobre lo que pueden hacer y cómo manejan las diferencias estructurales. – Peter

Cuestiones relacionadas