git-svn fetch在文件大小>上失败LONG_MAX

时间:2013-02-19 23:14:07

标签: perl git svn git-svn

我正在尝试使用git-svn从subversion迁移。

现在我被

的失败所阻挡
$ git svn fetch 

在Git.pm的第900行(来自git-svn包)

失败
...
    my $read = read($in, $blob, $bytesToReadd);

在名为cat_blob()的子目录中 问题是该文件是2567089913字节,当git-svn到达2147484672时,它会消息“消息在字符串外”。 cat_blob尝试将整个文件保存在变量中,然后再将其写入磁盘。

我尝试将文件的写入从子句末尾移动到读取循环内部,

(这是我修改后的代码的样子)

890         my $size = $1;
891 
892         my $blob;
893         my $bytesRead = 0;
894 
895         while (1) {
896                 my $bytesLeft = $size - $bytesRead;
897                 last unless $bytesLeft;
898 
899                 my $bytesToRead = $bytesLeft < 1024 ? $bytesLeft : 1024;
900                 print $size, " ", $bytesLeft, " ", $bytesRead, "\n";
901                 my $read = read($in, $blob, $bytesToReadd);
902                 unless (defined($read)) {
903                         $self->_close_cat_blob();
904                         throw Error::Simple("in pipe went bad");
905                 unless (print $fh $blob) {
906                         $self->_close_cat_blob();
907                         throw Error::Simple("couldn't write to passed in filehandle");
908         }
909 
910                 }
911 
912                 $bytesRead += $read;
913         }

但现在我收到了一个新错误:

Checksum mismatch: root/Instruments/MY_DIR/MASSIVE_FILE.exe bca43a9cb6c3b7fdb76c460781eb410a34b6b9ec
expected: 52daf59b450b82a541e782dbfb803a32
     got: d41d8cd98f00b204e9800998ecf8427e

我不是一个perl家伙。 perl是否在那里的打印声明中添加了额外的废话? 我有什么想法可以通过校验和吗?

1 个答案:

答案 0 :(得分:3)

修复缩进时,错误会变得明显。

890         my $size = $1;
891 
892         my $blob;
893         my $bytesRead = 0;
894 
895         while (1) {
896                 my $bytesLeft = $size - $bytesRead;
897                 last unless $bytesLeft;
898 
899                 my $bytesToRead = $bytesLeft < 1024 ? $bytesLeft : 1024;
900                 print $size, " ", $bytesLeft, " ", $bytesRead, "\n";
901                 my $read = read($in, $blob, $bytesToReadd);
902      --->       unless (defined($read)) {
903                     $self->_close_cat_blob();
904                     throw Error::Simple("in pipe went bad");
905      --->           unless (print $fh $blob) {
906                         $self->_close_cat_blob();
907                         throw Error::Simple("couldn't write to passed in filehandle");
908                     }
909 
910                 }
911 
912                 $bytesRead += $read;
913         }

永远不会达到print。只需将905-909移至912。

哦,你在第901行中将$bytesToRead误解为$bytesToReadd。编译器没有选择它吗?

你应该使用大于1024的块大小.64 * 1024会快得多。