我正在尝试使用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是否在那里的打印声明中添加了额外的废话? 我有什么想法可以通过校验和吗?
答案 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会快得多。