2

我正在尝试使用 git-svn 从颠覆中迁移。

现在我被失败阻止了

$ git svn fetch 

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

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

在名为 cat_blob() 的子文件中,问题是该文件是 2567089913 字节,当 git-svn 到达 2147484672 时,它会因消息“Offset outside of string”而窒息。cat_blob 尝试将整个文件保存在一个变量中,然后再将其写入磁盘。

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

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

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 是否在 print 语句中添加了额外的废话?有什么想法可以通过校验和吗?

4

1 回答 1

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 会快得多。

于 2013-02-19T23:29:37.900 回答