Pregunta

Estamos usando git-svn para administrar sucursales de un repositorio SVN.Nos enfrentamos al siguiente problema:después de varias confirmaciones por parte del usuario X en la rama, al usuario Y le gustaría usar git-svn para fusionar los cambios en la rama con el tronco.El problema que estamos viendo es que los mensajes de confirmación para todas las operaciones de fusión individuales parecen haber sido realizados por el usuario Y, mientras que el cambio real en la rama lo realizó el usuario X.

¿Hay alguna manera de indicarle a git-svn que al fusionar, use el mensaje/autor de confirmación original para un cambio determinado en lugar de la persona que realiza la fusión?

¿Fue útil?

Solución

La página de manual de git-svn recomienda que no uses fusionar.""Se recomienda ejecutar git-svn fetch y rebase (no extraer ni fusionar)"".Dicho esto, puedes hacer lo que quieras :-)

Hay 2 problemas aquí.La primera es que svn sólo almacena el comprometido, no el autor de un parche como lo hace git.Entonces, cuando Y confirma las fusiones en el tronco, svn solo registra su nombre, aunque los parches fueron escritos por X.Esto es un asombroso característica de git, sorprendentemente simple pero vital para proyectos de código abierto en los que atribuir cambios al autor puede evitar problemas legales en el futuro.

En segundo lugar, git no parece utilizar las funciones relativamente nuevas de combinación de svn.Esto puede ser algo temporal, ya que git se desarrolla activamente y se agregan nuevas funciones todo el tiempo.Pero por ahora no los utiliza.

Lo intenté con git 1.6.0.2 y "pierde" información en comparación con hacer la misma operación con svn merge.En svn 1.5, se agregó una nueva característica a los métodos de registro y anotación, de modo que svn log -g en el tronco generaría algo como esto para una fusión:

------------------------------------------------------------------------
r5 | Y | 2008-09-24 15:17:12 +0200 (Wed, 24 Sep 2008) | 1 line

Merged release-1.0 into trunk
------------------------------------------------------------------------
r4 | X | 2008-09-24 15:16:13 +0200 (Wed, 24 Sep 2008) | 1 line
Merged via: r5

Return 1
------------------------------------------------------------------------
r3 | X | 2008-09-24 15:15:48 +0200 (Wed, 24 Sep 2008) | 2 lines
Merged via: r5

Create a branch

Aquí, Y confirma r5, que incorpora los cambios de X en la rama al tronco.El formato del registro no es realmente tan bueno, pero se destaca con svn listening -g:

       2          Y int main()
       2          Y {
G      4          X   return 1;
       2          Y }

Aquí, suponiendo que Y solo se compromete con el tronco, podemos ver que X editó una línea (en la rama) y la fusionó.

Por lo tanto, si está utilizando svn 1.5.2, posiblemente sea mejor fusionarse con el cliente svn real por ahora.Aunque perderías información de fusión en git, normalmente es lo suficientemente inteligente como para no quejarte.

Actualizar:Acabo de probar esto con git 1.7.1 para ver si ha habido algún avance mientras tanto.La mala noticia es que merge dentro de git aún no completa los valores de svn:mergeinfo, por lo que git merge seguido por git svn dcommit no configurará svn:mergeinfo y perderá la información de combinación si el repositorio de Subversion es la fuente canónica, lo cual probablemente lo sea.La buena noticia es que git svn clone lee en las propiedades svn:mergeinfo para construir un mejor historial de fusión, por lo que si usas svn merge correctamente (requiere fusionar ramas completas), entonces el clon de git se verá correcto para los usuarios de git.

Otros consejos

Puedes usar injertos para enseñarle a git sobre fusiones que no están indicadas en el objeto de confirmación en cuestión.

echo "$merge_sha1 $parent1_sha1 $parent2_sha1" >> .git/info/grafts

Encontrar esta información es bastante fácil:dado encontrar el compromiso de fusión en cuestión, ya sabes $merge_sha1 y $parent1_sha1 ya.Convencionalmente, el mensaje de confirmación de dicha confirmación contendrá el número de revisión SVN de la segunda confirmación principal, que simplemente se traduce al ID de confirmación correspondiente:

git svn find-rev r$revnum $branch

Listo, tienes los 3 datos que necesitas para crear el injerto.

Intente usar las opciones --add-author-from y --use-log-author para git-svn.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top