2

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はそこの印刷ステートメントに余分ながらくたを入れますか?チェックサムに合格する方法はありますか?

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 に答える