Git svn dcommit не работает из-за ошибки утверждения "svn_fspath__is_canonical (child_fspath)" (cygwin) - программирование
Подтвердить что ты не робот

Git svn dcommit не работает из-за ошибки утверждения "svn_fspath__is_canonical (child_fspath)" (cygwin)

Надеюсь, кто-нибудь может мне помочь.

Когда я пытаюсь перенаправить локальную ветвь git на сервер svn, это всегда приведет к этой ошибке:

$ 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

Предпосылки:

  • очистить локальный репозиторий git (без поэтапных или неустановленных изменений)
  • называется git svn rebase перед

Установка Cygwin содержит следующие пакеты:

  • git, git -svn 1.7.9-1
  • subversion, subversion-perl 1.8.0-1

При поиске этой проблемы в Интернете я обнаружил несколько таких ошибок, когда путь не мог быть канонизирован. Но я не нашел решения для этой проблемы.

Кто-нибудь знает, как его решить? Отсутствует ли какая-либо информация?

4b9b3361

Ответ 1

У меня также была эта проблема (git версия 1.8.3) и была решена путем понижения подрывной деятельности до 1.7.9 (из 1.8.0).

Ответ 2

Если вы не можете перейти на SVN 1.7.X, другой вариант выполняет команду Git -SVN следующим образом:

git svn dcommit -C1 -l1

В основном это отключает обнаружение переименования Git (так что это обходной путь, а не исправление). Вы потеряете информацию о переименовании трека (переименование будет зафиксировано как удаление, за которым следует новый файл, например SVN 1.4). Но фиксация будет работать.

Изменить. Несмотря на некоторые комментарии здесь, я считаю, что это будет работать с текущей версией Git в репозитории Cygwin (1.7.9.1). Если в какой-то день это изменится, я соответственно обновлю ответ.

На самом деле, давайте надеемся, что ситуация улучшится до такой степени, что мы не будем нуждаться в каком-либо исправлении или обходном пути, а Git -SVN работает только (как раньше).: -)

Ответ 3

Простой способ установить исправленную версию git -svn из github:

  • Найдите багги script:

    find /usr -name Editor.pm
    
  • Замените его исправленной версией:

    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
    

Ответ 4

Мне удалось решить эту проблему без понижения svn. Ошибка msg была такой:

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...

то я переустановил непосредственно перед этим фиксацией, удалил File1.hpp, сделал новый коммит и в следующем просто добавил File2.hpp, как новый. После этого git svn dcommit больше не жаловался.

Ответ 5

Не удалось сэкономить svn: ошибка в крепостном бэкэнде, поэтому нужно также переключиться на неоновый бэкэнд.

Ошибка была исправлена ​​в svn upstream: http://thread.gmane.org/gmane.comp.version-control.subversion.devel/145186.

Там обходной путь представлен git вверх по течению: http://thread.gmane.org/gmane.comp.version-control.git/237906/focus=239690. Как и в perl, вы можете применить его локально к вашей установленной версии, прежде чем какой-либо из вышеперечисленных выпусков и будет распространяться в вашу среду.

Ответ 6

Я испытал то же самое на OSX с fink и решил его, понизив svn и perl swig svn привязки до 1.7.11 с 1.8 (и затем перестраивая, на всякий случай, git -svn).

Проблема возникла при переименовании и произошла как на серверах 1.6.12, так и 1.7.9, через dav_svn, в репозитории формата 1.6 (я не уверен, что это происходит и с svn + ssh).

git -svn находится в версии 1.8.3.3, что было требованием в моем случае (поскольку только git -svn >= 1.7.7 может объединять ветки svn-tracked, см. здесь).

Ответ 7

Я боролся с принятым ответом. Я просто чувствовал, что принятые ответы говорят вам, что делать, а не как это делать. Мне было намного легче перейти на главную версию git, чем подрывная версия downgrade в cygwin. Имейте в виду, что один из них исправит проблему. Я документировал, как создать главную версию git здесь: Как мне создать и использовать последнюю версию git на cygwin?

Ответ 8

У меня была та же проблема и я решил ее вернуться к git -svn 1.7.5.1 (svn 1.7.10).

Не уверен, но я думаю, проблема в том, что репозиторий был клонирован с предыдущей версией svn (1.7.xxx), и по какой-то причине новая версия (1.8.0) не может справиться с ней правильно.

Ответ 9

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);