with tortoise software consola branches svn git merge git-svn

tortoise - ¿Puede git-svn poblar correctamente las propiedades de svn: mergeinfo?



migrate svn to git with branches (4)

Estoy evaluando git-svn y tratando de determinar qué tan bien jugará con un repositorio svn particular. Lo que más me preocupa es conseguir que git-svn realice fusiones de tal manera que la propiedad svn: mergeinfo se establezca correctamente en el repositorio de subversión. es posible?

Esto es lo que he hecho hasta ahora:

# Checkout the SVN repo. $ git svn clone svn://server/project1 -T trunk -b branches -t tags # Make sure we are working on trunk. $ git reset --hard remotes/trunk # Modify the working copy. $ vim file.txt # Commit locally to the git repo. $ git commit -a # Push the commits back to the SVN server. $ git svn dcommit Committing to svn://server/project1/trunk ... M file.txt Committed r178 M file.txt r178 = b6e4a3a0c28e7b9aa71d8058d96dcfe7c8a2b349 (trunk)

¿Ahora cómo voy a fusionar ese compromiso particular en una de las ramas de subversión? De nuevo, es muy importante para mí que git establezca correctamente la propiedad svn: mergeinfo cuando se confirma el cambio.


Parte teórica

El problema es que Subversion y Git tienen mecanismos de seguimiento de fusión significativamente diferentes.

Como resultado, cierta información de fusión no se puede traducir correctamente de Subversion a Git. Por ejemplo, Git no rastrea en absoluto las selecciones cerebrales, cuando SVN las sigue incluso en el nivel de los subdirectorios.

Por otro lado, no hay problemas para representar el historial de fusión de Git en Subversion. Pero tenga cuidado aquí, ya que algunas propiedades de archivo / directorio SVN no están presentes en el repositorio de Git (por ejemplo, svn: palabras clave), las modificaciones de estas propiedades se pierden en el repositorio SVN una vez que se compromete una fusión.

Parte práctica

git-svn no establece automáticamente la propiedad svn: mergeinfo según todos los padres de Git commit. Pero puede especificar el valor de la propiedad manualmente antes de enviar la confirmación correspondiente.

Eche un vistazo a SubGit , un reemplazo del servidor para git-svn. Traduce la fusión de información en ambas direcciones cuando es posible. También admite propiedades SVN como svn: ignore, svn: eol-style y svn: mime-type.

Para obtener más información, consulte la documentación de SubGit y la comparación de SubGit vs. git-svn .

SubGit es un producto comercial con opciones gratuitas para proyectos de código abierto, académicos y pequeños. Y soy uno de los desarrolladores de SubGit.


Aunque esta es una vieja pregunta, el estado actual de las cosas con git-svn ha cambiado desde que se le preguntó. Específicamente, en git 1.7.5, hay un soporte limitado para configurar el svn: mergeinfo cuando se vuelve a enviar a svn.

git svn dcommit ahora acepta el -mergeinfo=<mergeinfo> . Para citar de la página de manual de 1.7.5+ :

-mergeinfo = <mergeinfo>

Agregue la información de fusión dada durante el compromiso (por ejemplo, --mergeinfo = "/ branches / foo: 1-10"). Todas las versiones del servidor svn pueden almacenar esta información (como una propiedad), y los clientes svn a partir de la versión 1.5 pueden hacer uso de ella. git svn actualmente no lo usa y no lo configura automáticamente.

Uno debe ser muy cuidadoso al usar esto sin embargo. Aunque la página del manual dice "agregar", lo que realmente significa es "reemplazar". Es decir, el atributo svn:mergeinfo se establece en función de lo que se pasa, no agrega las revisiones especificadas al svn:mergeinfo ya existente. Aprende de mi error ...

Editar:

Parece que todavía están trabajando para mejorar esto aún más. A partir de git-svn 1.7.7 , se agregó el siguiente texto a la página man de git-svn:

clave de configuración: svn.pushmergeinfo

Esta opción hará que git-svn intente llenar automáticamente la propiedad svn: mergeinfo en el repositorio SVN cuando sea posible. Actualmente, esto solo se puede hacer cuando se realizan fusiones no rápidas donde todos los padres, excepto el primero, ya han sido insertados en SVN.



Respuesta corta: No, git-svn no se preocupa por las propiedades de svn: mergeinfo, ya que git-svn no se está fusionando de nuevo a svn (está haciendo commits).

Respuesta larga: la mayoría de las personas usan git-svn para salir de la fusión de svn con daño cerebral. El problema con svn es que no diferencia entre la copia de archivos o carpetas (a menudo causada por la refactorización) y la creación de una bifurcación ya que la creación de una bifurcación o etiqueta se realiza mediante el comando "svn copy". La propiedad svn: mergeinfo es una curita sobre este problema, pero todavía hay casos en que las modificaciones son ambiguas. Git tiene un soporte mucho más robusto para la bifurcación y la fusión.