17

我希望有人能帮助我。

当我尝试将本地 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 安装包含以下软件包:

  • 混帐,混帐-svn 1.7.9-1
  • 颠覆,颠覆-perl 1.8.0-1

在互联网上搜索这个问题时,我发现了几个这样的错误,其中路径无法规范化。但我没有找到解决这个问题的方法。

有人知道如何解决吗?是否缺少任何信息?

4

9 回答 9

13

如果您无法降级到 SVN 1.7.X,另一种选择是以这种方式执行 Git-SVN 提交:

git svn dcommit -C1 -l1

这基本上会关闭 Git 重命名检测(因此这是一种解决方法,而不是修复)。您将丢失重命名曲目信息(重命名将作为删除提交,然后是新文件,如 SVN 1.4)。但是提交将起作用。

编辑尽管这里有一些评论,但我相信这将适用于 Cygwin 存储库 (1.7.9.1) 上的当前 Git 版本。如果有一天情况发生变化,我会相应地更新我的答案。

事实上,让我们希望情况改善到我们不需要任何修复或解决方法的地步并且 Git-SVN 可以正常工作(就像以前一样)。:-)

于 2013-12-21T01:07:15.287 回答
7

我也有这个问题(git 版本 1.8.3)并通过将subversion降级到 1.7.9(从 1.8.0)来解决它。

于 2013-08-02T15:10:44.400 回答
4

从 github 安装修补版本的 git-svn 的简单方法:

  1. 找到错误的脚本:

    find /usr -name Editor.pm
    
  2. 将其替换为修补版本:

    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
    
于 2014-02-10T10:43:54.310 回答
3

我已经设法在不降级 svn 的情况下解决这个问题。错误消息是这样的:

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 不再抱怨了。

于 2013-08-13T05:33:43.380 回答
2

降级 svn 并不能保证会有所帮助:该错误位于 serf 后端,因此还必须确保切换到 neon 后端。

该错误已在 svn 上游修复: http: //thread.gmane.org/gmane.comp.version-control.subversion.devel/145186

上游提交了一个解决方法:http: //thread.gmane.org/gmane.comp.version-control.git/237906/focus=239690。由于它在 perl 中,您可以在上述任何内容发布并传播到您的环境之前将其本地应用到您安装的版本。

于 2013-12-26T16:26:37.193 回答
1

我在 OSX 上使用 fink 也遇到过同样的情况,并通过将 svnperl swig svn 绑定从 1.8 降级到 1.7.11 来解决它(然后重建,以防万一,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 跟踪的分支,请参见此处)。

于 2013-08-01T10:02:06.717 回答
1

我为接受的答案而苦苦挣扎。我只是觉得接受的答案告诉你该怎么做,而不是怎么做。我发现升级到 git 的主版本比在 cygwin 中降级 subversion 容易得多。请记住,任何一个都可以解决问题。我在这里记录了如何构建 git 的主版本:如何在 cygwin 上构建和使用最新版本的 git?

于 2014-01-10T22:25:36.677 回答
0

我遇到了同样的问题并通过恢复到 git-svn 1.7.5.1 (svn 1.7.10) 解决了它。

不确定,但我认为问题在于存储库是用以前版本的 svn (1.7.xxx) 克隆的,由于某种原因,新版本 (1.8.0) 无法正确处理它。

于 2013-07-22T09:48:37.037 回答
0
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);
于 2014-01-20T15:13:09.807 回答