2011-01-28 47 views
53

Tôi có kho lưu trữ git nằm trên máy chủ có bộ nhớ hạn chế. Khi tôi cố gắng sao chép một kho lưu trữ hiện từ máy chủ tôi nhận được lỗi sauĐóng gói kho Git không thành công

[email protected]:$ git clone ssh://[email protected]/home/hemi/repos/articles 
Initialized empty Git repository in /home/hemi/Skrivebord/articles/.git/ 
[email protected]'s password: 
remote: Counting objects: 666, done. 
remote: warning: suboptimal pack - out of memory 
remote: fatal: Out of memory, malloc failed 
error: git upload-pack: git-pack-objects died with error. 
fatal: git upload-pack: aborting due to possible repository corruption on the remote side. 
remote: aborting due to possible repository corruption on the remote side. 
fatal: early EOF 
fatal: index-pack failed 
[email protected]:$ 

Để xử lý lỗi này tôi đã cố gắng để đóng gói lại các kho lưu trữ ban đầu (theo this forum post). Nhưng thay vì đóng gói lại kho lưu trữ, nó mô tả cách sử dụng lệnh "git pack-objects".

[email protected]:~/repos/articles$ git repack -a -d --window-memory 10m --max-pack-size 100m 
usage: git pack-objects [{ -q | --progress | --all-progress }] 
     [--all-progress-implied] 
     [--max-pack-size=N] [--local] [--incremental] 
     [--window=N] [--window-memory=N] [--depth=N] 
     [--no-reuse-delta] [--no-reuse-object] [--delta-base-offset] 
     [--threads=N] [--non-empty] [--revs [--unpacked | --all]*] 
     [--reflog] [--stdout | base-name] [--include-tag] 
     [--keep-unreachable | --unpack-unreachable 
     [<ref-list | <object-list] 

Git 1.6.5.7 được cài đặt trên máy chủ.

Trả lời

94

Giải pháp của bạn có bản sao làm việc cục bộ và từ xa, nhưng sẽ gây ra sự cố khi kho lưu trữ từ xa quyết định tự đóng gói lại. May mắn thay, bạn có thể thiết lập các tùy chọn cấu hình để giảm dung lượng bộ nhớ cần thiết để đóng gói lại trong cả hai kho - về cơ bản là tạo các tham số dòng lệnh mà bạn đã thêm vào các tùy chọn mặc định khi đóng gói lại. Vì vậy, bạn nên đăng nhập vào điều khiển từ xa, thay đổi vào kho lưu trữ và thực hiện:

git config pack.windowMemory 10m 
git config pack.packSizeLimit 20m 

Bạn có thể thực hiện tương tự trên kho lưu trữ cục bộ của mình. (Ngẫu nhiên tôi đoán rằng kho lưu trữ của bạn là rất lớn hoặc đây là những máy có ít bộ nhớ - những giá trị này dường như rất thấp đối với tôi.)

Đối với những gì nó đáng giá, khi nhận được lỗi malloc khi đóng gói rất kho lưu trữ lớn trong qua, tôi cũng đã thay đổi các giá trị của core.packedgitwindowsize, core.packedgitlimit, core.deltacachesize, pack.deltacachesize, pack.windowpack.threads nhưng nó có vẻ như thể bạn không cần bất kỳ tùy chọn hơn nữa :)

+2

Cảm ơn các tùy chọn cấu hình, trước đây tôi không nhận thức được chúng. Kho lưu trữ chứa một tập hợp lớn các tệp pdf. Tổng kích thước của kho lưu trữ (bao gồm thư mục .git và các tệp được theo dõi) là xấp xỉ 1,1 GB. Vì vậy, tôi đoán đó là một kho lưu trữ lớn ;-) – midtiby

+0

@MarkLongair: bạn đã cứu Sir của tôi! Tôi sắp chạy đến cửa hàng và mua một số nâng cấp RAM: D –

+0

@MarkLongair: Câu trả lời tuyệt vời !!! Cảm ơn thông tin hữu ích như vậy – nish

1

Tôi đang sử dụng phiên bản git 1.7.0.4 và nó chấp nhận lệnh này. Có thể là git version 1.6 không chấp nhận lệnh này.

Thử tạo kho lưu trữ mới với một số cam kết ngẫu nhiên. Sau đó, repack nó với lệnh này.

+0

Bạn đang nói về lệnh này? 'git repack -a -d --window-memory 10m --max-pack-size 100m' – Flimm

15

Tôi đã giải quyết sự cố bằng các bước sau.

  1. kho Got kiểm tra ra từ máy chủ đến máy địa phương của tôi (sử dụng một bản sao nguyên qua ssh)
  2. repacked kho địa phương
    git repack -a -d --window-memory 10m --max-pack-size 20m
  3. tạo một kho lưu trữ trống trên máy chủ
    git init --bare
  4. Đã đẩy kho lưu trữ cục bộ đến máy chủ
  5. Kiểm tra rằng có thể sao chép kho lưu trữ máy chủ
+4

Tôi rất vui khi biết bạn đã được sắp xếp, nhưng tôi nên cảnh báo bạn rằng bạn sẽ gặp lại vấn đề tương tự khi máy chủ quyết định đóng gói lại kho lưu trữ của nó. Tốt nhất là đặt các tùy chọn cấu hình trong kho lưu trữ từ xa (ví dụ như được đề xuất trong câu trả lời của tôi) để khi nó tự động đóng gói lại, bạn vẫn sẽ không hết bộ nhớ. –

+0

Cảm ơn, nó hoạt động – VolArt

5

này không trả lời câu hỏi, nhưng ai đó có thể chạy vào nó: repacking cũng có thể thất bại trên máy chủ khi pack-objects bị chấm dứt bởi một số loại kẻ giết người bộ nhớ (chẳng hạn như sử dụng trên Dreamhost):

$ git clone project-url project-folder 
Cloning into project-folder... 
remote: Counting objects: 6606, done. 
remote: Compressing objects: 100% (2903/2903), done. 
error: pack-objects died of signal 9284.51 MiB | 2.15 MiB/s 
error: git upload-pack: git-pack-objects died with error. 
fatal: git upload-pack: aborting due to possible repository corruption on the remote side. 
remote: aborting due to possible repository corruption on the remote side. 
fatal: early EOF 
fatal: index-pack failed 

Trên Dreamhost, điều này có vẻ là do mmap.Mã repack sử dụng mmap để ánh xạ nội dung của một số tệp vào bộ nhớ, và khi kẻ giết bộ nhớ không đủ thông minh, nó đếm các tệp mmapped như bộ nhớ đã sử dụng, giết chết quá trình Git khi nó cố gắng mmap một tệp lớn.

Giải pháp là biên dịch mã nhị phân Git tùy chỉnh với hỗ trợ mmap bị tắt (configure NO_MMAP=1).

+0

Bạn có biết nếu có thể thêm tùy chọn NO_MMAP = 1 vào cài đặt git hiện có không? –

+1

Tôi không nghĩ vậy, có vẻ như macro tiền xử lý dẫn đến mã khác nhau được tạo. Nhưng đó chỉ là một ý kiến, tôi đã không nghiên cứu nó. – zoul

16

Không có quyền truy cập trực tiếp vào kho lưu trữ và do đó không thể thực hiện một repack, thực hiện một bản sao nông và sau đó dần dần lấy trong khi tăng chiều sâu đã giúp cho tôi.

git clone YOUR_REPO --depth=1 
git fetch --depth=10 
... 
git fetch --depth=100 
git fetch --unshallow //Downloads all history allowing to push from repo 

Hy vọng nó vẫn có thể giúp ai đó.

+0

như là một phương sách cuối cùng cho rất nhiều công việc, điều này thực sự làm việc. Cảm ơn. –

+1

'git clone REPO --depth = 1' vẫn không thành công cho tôi với lỗi 'remote: aborting do tham nhũng kho lưu trữ ở phía bên kia.' – Flimm

0

Tôi đã gặp sự cố tương tự trên ubuntu 14.10 với git 2.1.0 trên kho lưu trữ github.com riêng tư. (! Entreprise router nghi ngờ Hoạt động trên mạng wifi khác nhau, ngoại trừ tại nơi làm việc)

* GnuTLS recv error (-54): Error in the pull function. 
* Closing connection 2jects: 31% (183/589) 
error: RPC failed; result=56, HTTP code = 200 
fatal: The remote end hung up unexpectedly 
fatal: protocol error: bad pack header 

giải pháp của tôi là, để git clone sử dụng ssh (tôi thiết lập phím ssh * trước), như thế này:

git clone https://github.com/USERNAME/REPOSITORYNAME.git

trở thành:

git clone [email protected]: USERNAME/REPOSITORYNAME.git

*: (Tạo một khoá ssh)

ssh-keygen -t rsa C "[email protected]"

Sau đó đăng nhập vào github, trong cài đặt, nhập khóa ssh và nhập từ ~/.ssh/id_rsa.pub.

+0

Tôi đã nghe nói về các bộ định tuyến doanh nghiệp thực hiện quét nội dung và ngắt kết nối cho HTTP, nhưng không bao giờ HTTPS - bạn có giải mã và mã hóa lại lưu lượng HTTPS không? – Rup

+0

Rup: ​​Có hai bộ định tuyến liên quan trước khi ra internet. Tuần tới, tôi sẽ kiểm tra chính xác cách thiết lập tại công ty cụ thể đó. Tôi xác minh từ, nó không phải là thất bại bất cứ nơi nào khác (bất kỳ mạng wifi khác), chỉ cần tại công ty cụ thể. – arcol

Các vấn đề liên quan