2013-02-19 2 views
2

전복에서 마이그레이션하려면 git-svn을 사용하려고합니다. 지금 내가크기가> LONG_MAX보다 큰 파일에서 git-svn 가져 오기가 실패합니다.

$ git svn fetch 

의 실패에 의해 차단하고

서브라는 cat_blob에서

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

(힘내 - SVN 패키지에서)() Git.pm 라인 (900)에 실패 문제는 파일이 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 guy가 아닙니다. 펄은 print 문에 쓸데없는 것들을 넣었습니까? 어떻게 체크섬을 전달할 수있는 아이디어가 있습니까?

+0

'print'가 출력하는 내용에'$ \'이 추가되지만 기본적으로 빈 문자열이며, 비어 있지 않으면 변경 이전에도 잘못된 파일이 생성됩니다. – ikegami

+0

공식 git 트리에서이 문제를 해결할 수있는 패치를받을 수있었습니다. 이것은 여전히 ​​야생에서 문제지만, 자식 1.8.3에서 수정되어야합니다 –

답변

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로 이동하십시오.

오, $bytesToRead의 줄은입니다. 컴파일러가이 파일을 선택하지 않았습니까?

1024보다 큰 블록 크기를 사용해야합니다. 64 * 1024는 훨씬 빠릅니다.

+0

내 대답에 대한 팁을 추가했습니다. – ikegami

+0

좋은 눈! 내 자신의 실수로 처벌 받는다. 필자는 속도가 디스크에 기록하기 전에 전체 파일을 버퍼링하는 이유라고 생각합니다. 2 GiB를 버퍼링하는 것과 매 킬로바이트를 쓰는 것 사이에는 행복한 매개체가 있어야합니다. 그러나 후자는 –

+0

@ Joshua Clayton에도 불구하고 절대로 블록하지 않고 버퍼링해서는 안됩니다. 편집 한 후 내 대답에 더 이상 문제가 표시되지 않습니다! 나는 그것을 되돌려 야했다. – ikegami

관련 문제