2011-05-18 18 views

Respuesta

12

La opción --dry-run para git svn dcommit es muy útil para encontrar exactamente lo que será comprometido con Subversion. En particular, que tiene las propiedades que:

  • En realidad, no se comprometen a nada Subversion
  • Se le indica qué diffs se calcularán para crear nuevas revisiones en Subversion
  • Se le dice que se ramifican en Subversion estará cometiendo a - a veces esto no es obvia, ya que se toma de la rama de Subversion se especifica en el primer antepasado de comprometerse con un git svn-id en su mensaje de confirmación

en general es una buena idea hacer git svn rebase antes incluso pensando en usar dcommit, para que su historial esté linealizado; de lo contrario, las asignaciones de fusión pueden no tener mucho sentido en el historial de Subversion. (Si usted ha hecho eso, entonces git log y gitk --all también será esencialmente equivalente, pero creo que git svn dcommit --dry-run le da una imagen más precisa de lo que está a punto de suceder, incluso si es más difícil de interpretar.)

1

La manera más fácil que creo es hacer esto usando gitk. Querrá la opción --all para ver todas las ramas. Si no ha usado antes simplemente escriba:

gitk --all 

verá una vista gráfica de los ramas. Cuando actualiza desde SVN, básicamente hace una rebase (git svn rebase). Esto significa que cualquier confirmación local que no esté registrada en SVN aparecerá en la rama después de la última confirmación de SVN. Básicamente, observe las confirmaciones entre su troncal SVN remota y su rama principal.

1

utilizo git log --oneline --graph:

* aaaaaaa commit message 
* bbbbbbb commit message 
|\ 
| * ccccccc commit message 
| * ddddddd commit message 
| * eeeeeee commit message 
|/ 
* fffffff commit message 
|\ 
...

Es fácil ver que comete aaaaaaa, bbbbbbb y fffffff están en la rama actual (maestro). Estas confirmaciones ya se han comprometido o se comprometerán con Subversion la próxima vez que ejecutes git svn dcommit. (Se compromete ccccccc, ddddddd, eeeeeee están en una rama separada, que se fusionó con maestría y no se compromete a la subversión como confirmaciones separadas.)

+0

vale la pena estar claro que los cambios introducidos en 'ccccccc',' 'ddddddd' y eeeeeee' va a terminar en la subversión, ya que la diferencia calculada para la fusión compromete 'ffff ffff' incluirá los cambios de nuevo a 'bbbbbbbb', suponiendo que el primer padre de' ffffffff' es 'bbbbbbbb', como sugieres diciendo que la rama se" fusionó con el maestro ". Sin embargo, esos cambios no aparecerán como revisiones por separado, por lo que los resultados pueden ser menos que ideales; lo más seguro es hacer 'git svn rebase' primero si quiere enviar dicho historial a Subversion. –

+0

@Mark Longair: Mi intención era disipar cualquier temor de que 'ccccccc',' ddddddd' y 'eeeeeee' aparecieran en Subversion como confirmaciones separadas. En mi experiencia, esos commits a menudo constituyen una rama de características y no serían adecuados como commit de Subversion por separado. – titaniumdecoy

0

Para Sólo hay que ver la lista de confirmaciones, aquí está mi magia:

git svn dcommit -n | sed 1d | cut -d" " -f3 | xargs -I{} git log --oneline --no-walk {} 

de salida:

c2e1eff changed a thing 
a889dbf changed a second thing 
18a4653 undid the second thing-- oops 
Cuestiones relacionadas