¿Cómo ver qué se ha registrado en git, pero no se ha comprometido con svn a través de dcommit?

Estoy usando gitsvn. ¿Cómo puedo get una list de lo que he comprometido en git, pero aún no me he comprometido con el repository SVN desde el último git svn dcommit ? Es decir, ¿cómo puedo verificar lo que se va a enviar si realizo un compromiso?

La opción --dry-run para git svn dcommit es muy útil para descubrir exactamente qué se comprometerá con Subversion. En particular, eso tiene las properties que:

  • En realidad, no compromete nada a Subversion
  • Te dice qué diferencias se calcularán para crear nuevas revisiones en Subversion
  • Te dice en qué twig de Subversion te comprometes: a veces esto no es obvio, ya que se toma de la twig de Subversion especificada en el primer ancestro y se entrega con un git-svn-id en su post de confirmación.

En general, es una buena idea hacer git svn rebase incluso antes de pensar en usar dcommit , para que tu historial esté linealizado; de lo contrario, las dcommit fusión pueden no tener mucho sentido en el historial de Subversion. (Si has hecho eso, entonces git log y gitk --all también serán esencialmente equivalentes, pero creo que git svn dcommit --dry-run te da una git svn dcommit --dry-run más precisa de lo que está por suceder, incluso si es más difícil interpretar.)

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

 gitk --all 

Verás una vista gráfica de tus twigs. 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 twig después de la última confirmación de SVN. Básicamente, observe las confirmaciones entre su troncal SVN remota y su twig principal.

Yo uso 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 los commits aaaaaaa , bbbbbbb y fffffff están en la twig actual (principal). Estas confirmaciones ya se han comprometido o se comprometerán con Subversion la próxima vez que ejecutes git svn dcommit . (Los ccccccc , ddddddd , eeeeeee están en una twig separada que se fusionó en master y no se asignará a Subversion como commits separados ).

Para ver la list de commits, aquí está mi magia:

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

salida:

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