2010-11-21 9 views
6

Estoy intentando utilizar git-svn con el siguiente proyecto:git-svn no dcommit, incluso después de la salida limpia

https://svn.apache.org/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk/

Qué he comprobado a cabo utilizando el estándar git svn clone https://svn.apache.org/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk/ -T trunk -b branches -t tags invocación.

empecé a tener problemas para usar git-svn dcommit con git-svn después de la ramificación con git checkout -b y no git svn branch, y luego la fusión de esa rama local al maestro, y tratando de dcommit. Ahora, curiosamente, incluso después de hacer una comprobación limpia, sigo teniendo errores cuando intento comprometerme.

La siguiente traza bastante largo es representante de mi flujo de trabajo actual con git-svn:

[email protected]:~/workspace/gsoc2010/scxml-js$ git svn dcommit 
Committing to https://[email protected]/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk ... 
     M  build-common.xml 
     M  src/xslt/backends/js/StateTableStatechartGenerator.xsl 
     M  src/xslt/backends/js/SwitchyardStatechartGenerator.xsl 
     M  src/xslt/ir-compiler/appendTransitionInformation.xsl 
     M  src/xslt/ir-compiler/copyEnumeratedEventTransitions.xsl 
     M  src/xslt/ir-compiler/flattenTransitions.xsl 
     M  src/xslt/ir-compiler/nameTransitions.xsl 
     M  src/xslt/ir-compiler/numberStatesAndTransitions.xsl 
     M  src/xslt/ir-compiler/splitTransitionTargets.xsl 
     M  src/xslt/util/language-frontend-module-generators/sh-from-topo-sort-list-generator.xsl 
     M  src/xslt/util/topo-sort.xsl 
Committed r1037491 
W: 502073c202cb1fbe089f0e8b7100304f0aa74729 and refs/remotes/trunk differ, using rebase: 
:100644 100644 7930fd690be01a5716490704b5556e2b5cab5ba6 51047f2c8cf1daaa94ae44433a9aa2acc222ae43 M  build-common.xml 
:040000 040000 59251941b33bda1376881b33bb2263ea87b1b947 2f5e2586e26bc7d05def065cfcf05327982b81d7 M  src 
Current branch master is up to date. 
# of revisions changed 
before: 
39c6f7e2d7b82cc782b8770d1ddb0ecb4f86e780 
c5f360feb3a6bdaab2fb2f48d05e8691824e3231 

after: 
502073c202cb1fbe089f0e8b7100304f0aa74729 
39c6f7e2d7b82cc782b8770d1ddb0ecb4f86e780 
c5f360feb3a6bdaab2fb2f48d05e8691824e3231 
If you are attempting to commit merges, try running: 
     git rebase --interactive --preserve-merges refs/remotes/trunk 
Before dcommitting 
[email protected]:~/workspace/gsoc2010/scxml-js$ git svn rebase 
     M  build-common.xml 
     M  src/xslt/ir-compiler/nameTransitions.xsl 
     M  src/xslt/ir-compiler/copyEnumeratedEventTransitions.xsl 
     M  src/xslt/ir-compiler/appendTransitionInformation.xsl 
     M  src/xslt/ir-compiler/flattenTransitions.xsl 
     M  src/xslt/ir-compiler/numberStatesAndTransitions.xsl 
     M  src/xslt/ir-compiler/splitTransitionTargets.xsl 
     M  src/xslt/backends/js/SwitchyardStatechartGenerator.xsl 
     M  src/xslt/backends/js/StateTableStatechartGenerator.xsl 
     M  src/xslt/util/language-frontend-module-generators/sh-from-topo-sort-list-generator.xsl 
     M  src/xslt/util/topo-sort.xsl 
r1037491 = e8d820cfdca882a57fbfa003b9673313be6c9621 (refs/remotes/trunk) 
First, rewinding head to replay your work on top of it... 
Applying: Changed some paths around so python fronend works. 
Applying: Removed test_with_xsltproc.sh. This file no longer needed, as we now generate a bash backend module. 
[email protected]:~/workspace/gsoc2010/scxml-js$ git svn dcommit 
Committing to https://[email protected]/repos/asf/commons/sandbox/gsoc/2010/scxml-js/trunk ... 
     M  src/python/scxml/cgf/backends/js 
     M  src/python/scxml/cgf/xslt 
Committed r1037493 
W: 8563b885bfca77ccb33a87f56f78e6323af022a9 and refs/remotes/trunk differ, using rebase: 
:040000 040000 c33b3d66ecc6735af3241d7f9cee383d2736f614 59251941b33bda1376881b33bb2263ea87b1b947 M  src 
Current branch master is up to date. 
# of revisions changed 
before: 
574e2e495fa12cf3d81004638a06e3315d0abba5 

after: 
8563b885bfca77ccb33a87f56f78e6323af022a9 
574e2e495fa12cf3d81004638a06e3315d0abba5 
If you are attempting to commit merges, try running: 
     git rebase --interactive --preserve-merges refs/remotes/trunk 
Before dcommitting 

que básicamente tiene que hacer un git svn dcommit seguido de un git svn rebase para cada confirmación desde la última dcommit. Esto generalmente funciona limpiamente, pero a veces falla y requiere más trabajo manual.

¿Qué podría estar causando este problema con dcommit, de modo que incluso si utiliza un proceso de pago limpio no lo resuelve?

+1

Lo único que se me ocurre es que el servidor SVN remoto está bloqueando la confirmación de alguna manera, de modo que la confirmación SVN resultante no coincide al 100% con la confirmación de Git que acaba de pulsar. Puede intentar crear una nueva bifurcación en la misma bifurcación que está comprometiendo (para que se conserven las confirmaciones) y diferenciar entre una confirmación enviada a SVN y la confirmación de Git que le corresponde para ver si ese es el caso. – cdhowie

Respuesta

5

Me acabo de encontrar con esto y finalmente descubrió lo que está pasando: Al acceder a un repositorio SVN a través de HTTP y write-through proxying, la recomendada post-commit gancho corre svnsync en el fondo. La confirmación a través de HTTP finaliza tan pronto como finalice el servidor SVN, pero antes de que el proxy HTTP que está leyendo se haya actualizado a la nueva revisión. git-svn realiza una confirmación seguida de una recuperación y ve el proxy HTTP obsoleto sin la nueva revisión. Asume que obtuvo la nueva revisión y diffs la punta del control remoto con lo que intentó comprometer y ve el conflicto.

Si controla la configuración del proxy SVN puede hacer que el svnsync sea sincrónico (esto funcionó durante mucho tiempo hasta que alguien me sorprendió con un cambio de configuración). De lo contrario creo git-svn necesita un mecanismo de reintento:

diff --git a/git-svn.perl b/git-svn.perl 
index 09c4ca5..af9aea1 100755 
--- a/git-svn.perl 
+++ b/git-svn.perl 
@@ -57,6 +57,7 @@ use File::Spec; 
use File::Find; 
use Getopt::Long qw/:config gnu_getopt no_ignore_case auto_abbrev/; 
use IPC::Open3; 
+use Time::HiRes qw/usleep/; 
use Git; 

BEGIN { 
@@ -574,7 +575,17 @@ sub cmd_dcommit { 
           $gs->{inject_parents_dcommit}->{$cmt_rev} = 
                   $parents->{$d}; 
         } 
-      $_fetch_all ? $gs->fetch_all : $gs->fetch; 
+      my $retry; 
+      fetch: for ($retry = 0; $retry < 30; ++$retry) { 
+       $_fetch_all ? $gs->fetch_all : $gs->fetch; 
+       last fetch if ($gs->rev_map_max >= $cmt_rev); 
+       # Asynchronous commit push not complete 
+       usleep(20000 * ($retry + 1)); 
+      } 
+      if ($retry > 0 && $gs->rev_map_max < $cmt_rev) { 
+       fatal "New revision $cmt_rev did not appear", 
+         "in repository after $retry retries."; 
+      } 
         $last_rev = $cmt_rev; 
         next if $_no_rebase; 

$ 

Si esto parece una buena idea esta noche voy a enviar un parche.

Actualización: Si bien el uso de este terminé con:

Author: syncuser <[email protected]> 

en una de mis propias confirmaciones. Por lo tanto, puede haber una condición de carrera en la que el script vea una sincronización parcial. Esto es molesto pero no fatal.

+0

Gracias por la respuesta. Creo que esta solución probablemente funcione, pero he encontrado otra forma de solucionar el problema. Estoy en Europa ahora mismo y svn.apache.org se asigna de forma transparente a svn.eu.apache.org, que es un espejo de svn.us.apache.org. Supongo que comprometerse con el espejo no funciona bien, probablemente por el problema que mencionaste. Sin embargo, al clonar explícitamente desde svn.us.apache.org, dcommit ahora parece funcionar bien. – jbeard4

+0

Solo una nota para mí que cometí una rev con 5 bitfiles FPGA usando mi parche (arriba) e incluso después de 30 intentos el proxy no había visto la nueva versión (por lo que esperaban unos 10 segundos). Bleah. –

Cuestiones relacionadas