git svn dcommit falla debido al error de aserción "svn_fspath__is_canonical (child_fspath)" (cygwin)

Espero que alguien pueda ayudarme

Cuando bash enviar mi twig local de git al server svn, esto siempre dará como resultado este error:

$ git svn dcommit Committing to http://.../Dev_Stream/01_workspace ... C path/to/file/AbstractSystemThread.java => other/path/to/file/Thread/AbstractThread.java assertion "svn_fspath__is_canonical(child_fspath)" failed: file "/usr/src/subversion/subversion-1.8.0-1/src/subversion-1.8.0/subversion/libsvn_subr/dirent_uri.c", line 2502, function: svn_fspath__skip_ancestor 

Condiciones previas:

  • limpiar el repository local de git (sin cambios por etapas ni por etapas)
  • llamado git svn rebase antes

La installation de Cygwin contiene estos packages:

  • git, git-svn 1.7.9-1
  • subversión, subversión-perl 1.8.0-1

Al search este problema en Internet, encontré varios errores como este en los que una ruta no podía canonicalizarse. Pero no encontré una solución para exactamente este problema.

¿Alguien tiene una idea de cómo resolverlo? ¿Falta alguna información?

También tuve este problema (git versión 1.8.3) y lo resolví degradando la subversión a 1.7.9 (desde 1.8.0).

Si no puede degradar a SVN 1.7.X, otra opción es hacer el commit de Git-SVN de esta manera:

 git svn dcommit -C1 -l1 

Esto básicamente desactiva la detección de cambio de nombre de Git (por lo que es una solución, no una solución). Perderá la información de la pista de cambio de nombre (un cambio de nombre se confirmará como una eliminación seguida de un nuevo file, como SVN 1.4). Pero la confirmación funcionará.

Editar A pesar de algunos comentarios aquí, creo que esto funcionará con la versión actual de Git en el repository de Cygwin (1.7.9.1). Si algún día eso cambia, actualizaré mi respuesta en consecuencia.

De hecho, esperemos que la situación mejore hasta el punto de que no necesitemos ninguna solución o solución, y Git-SVN simplemente funciona (como solía hacerlo). 🙂

Una forma fácil de instalar la versión parcheada de git-svn desde github:

  1. Encuentra el script con errores:

     find /usr -name Editor.pm 
  2. Reemplácelo con la versión parchada:

     cd /usr/lib/perl5/vendor_perl/5.18.1/Git/SVN mv Editor.pm Editor.pm.bak wget https://raw.github.com/git/git/2394e94e831991348688831a384b088a424c7ace/perl/Git/SVN/Editor.pm 

He logrado resolver este problema sin degradar svn. El post de error fue así:

 git svn dcommit Committing to http://... C File1.hpp => File2.hpp ERROR from SVN: RA layer request failed: PUT request on '...File2.hpp' failed: 409 Conflict... 

Luego volví a configurar justo antes de este compromiso, eliminé File1.hpp, hice un nuevo commit y en el siguiente solo agregué File2.hpp como uno nuevo. Después de esto, git svn dcommit ya no se quejaba.

No se garantiza que la degradación de svn ayude: el error está en el back-end de server, así que también hay que asegurarse de pasar al back-end de neón.

El error ha sido parcheado en svn upstream: http://thread.gmane.org/gmane.comp.version-control.subversion.devel/145186 .

Hay una solución alternativa enviada a git upstream: http://thread.gmane.org/gmane.comp.version-control.git/237906/focus=239690 . Como está en Perl, puede aplicarlo localmente a su versión instalada, antes de que se libere y se propague a su entorno.

Experimenté lo mismo en OSX con fink y lo resolví degradando svn y swl svn bindings a 1.7.11 desde 1.8 (y luego reconstruyendo, por si acaso, git-svn).

El problema apareció en el cambio de nombre, y ocurrió tanto en el server 1.6.12 como en el 1.7.9, a través de dav_svn, en un repository de formatting 1.6 (no estoy seguro de si sucede con svn + ssh también).

git-svn está en la versión 1.8.3.3, que era un requisito en mi caso (ya que solo git-svn> = 1.7.7 puede fusionar twigs rastreadas por svn, ver aquí ).

Luché con la respuesta aceptada. Simplemente sentí que las respuestas aceptadas te dicen qué hacer, pero no cómo hacerlo. Me pareció mucho más fácil actualizar a la versión maestra de git que degradar la subversión en cygwin. Tenga en count que cualquiera de los dos solucionará el problema. He documentado cómo crear la versión maestra de git aquí: ¿Cómo creo y uso la última versión de git en cygwin?

Tuve el mismo problema y lo resolví volviendo a git-svn 1.7.5.1 (svn 1.7.10).

No estoy seguro, pero creo que el problema es que el repository se clonó con la versión anterior de svn (1.7.xxx) y, por alguna razón, la nueva versión (1.8.0) no puede manejarlo correctamente.

 diff -u /usr/local/lib/perl5/site_perl/5.16/Git/SVN/Editor.pm.bak /usr/local/lib/perl5/site_perl/5.16/Git/SVN/Editor.pm --- /usr/local/lib/perl5/site_perl/5.16/Git/SVN/Editor.pm.bak 2014-01-20 15:52:54.000000000 +0100 +++ /usr/local/lib/perl5/site_perl/5.16/Git/SVN/Editor.pm 2014-01-20 15:55:16.000000000 +0100 @@ -304,8 +304,9 @@ my ($self, $m, $deletions) = @_; my ($dir, $file) = split_path($m->{file_b}); my $pbat = $self->ensure_path($dir, $deletions); + my $upa= $self->url_path($m->{file_a}); my $fbat = $self->add_file($self->repo_path($m->{file_b}), $pbat, - $self->url_path($m->{file_a}), $self->{r}); + $upa, $self->{r}); print "\tC\t$m->{file_a} => $m->{file_b}\n" unless $::_q; $self->chg_file($fbat, $m); $self->close_file($fbat,undef,$self->{pool}); @@ -323,8 +324,9 @@ my ($self, $m, $deletions) = @_; my ($dir, $file) = split_path($m->{file_b}); my $pbat = $self->ensure_path($dir, $deletions); + my $upa= $self->url_path($m->{file_a}); my $fbat = $self->add_file($self->repo_path($m->{file_b}), $pbat, - $self->url_path($m->{file_a}), $self->{r}); + $upa, $self->{r}); print "\tR\t$m->{file_a} => $m->{file_b}\n" unless $::_q; $self->apply_autoprops($file, $fbat); $self->chg_file($fbat, $m);