2013-02-19 55 views
2

我想使用git-svn從subversion遷移。git-svn獲取失敗的文件,其大小> LONG_MAX

現在我已被的

$ git svn fetch 

失敗失敗上Git.pm的900線(從GIT-SVN封裝)

... 
    my $read = read($in, $blob, $bytesToReadd); 
在副稱爲cat_blob

() 問題是該文件是2567089913字節,並且當git-svn到達2147484672時,它會掐住一條消息「Offset of string」。 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是否會在這裏的print語句中添加額外的垃圾? 任何想法如何通過校驗和?

+0

'$ \'被追加到'print'打印的內容上,但默認情況下它是空字符串,如果它不是空的,甚至在更改之前就會創建壞文件。 – ikegami 2013-02-19 23:25:22

+0

我能夠得到一個補丁來解決這個官方的git樹。這仍然是一個問題,但它應該在git中修復1.8.3 – 2013-04-03 15:00:35

回答

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即可。

哦,你在0121行中拼寫爲$bytesToRead$bytesToReadd。編譯器沒有選擇它嗎?

您應該使用大於1024的塊大小。64 * 1024會快得多。

+0

在我的答案中添加了一條提示。 – ikegami 2013-02-19 23:37:23

+0

好眼睛!受我自己的sl Pun行爲的懲罰。我懷疑速度是爲什麼原始代碼在寫入磁盤之前緩衝整個文件的原因。嘗試緩存2個GiB和寫入每個千字節之間必須有一個愉快的媒介,但後者不應該失敗,阻止和緩衝區大小,儘管有 – 2013-02-19 23:43:17

+0

@Joshua Clayton,在您編輯之後,我的答案不再顯示問題!我不得不恢復它。 – ikegami 2013-02-20 03:06:25