tra-loi-cau-hoi-phat-trien-web.com

Git fetch / pull / clone treo trên các đối tượng nhận

Khi tìm nạp hoặc lấy từ kho git hoặc nhân bản kho lưu trữ, tôi đi đến điểm này:

remote: Counting objects: 6666, done.
remote: Compressing objects: 100% (5941/5941), done.
Receiving objects:  23% (1534/6460), 11.68 MiB | 23 KiB/s  

Và nó bị treo. 23%/số lượng đối tượng không phải là nhất định, có vẻ như dao động từ một chữ số đến tối đa 60, dường như. Ngoài ra tốc độ tải xuống được liệt kê đóng băng - không giống như nó từ từ bò xuống không.

Anh chàng tôi ngồi bên cạnh không có vấn đề gì, vì vậy đó không phải là vấn đề về bộ định tuyến. Chúng tôi sử dụng beanstalk cho kho lưu trữ công việc của chúng tôi, nhưng tôi có vấn đề từ beanstalk và github (mặc dù đôi khi có vẻ như một github sẽ kết thúc).

Vấn đề dường như chỉ tăng lên kể từ khi nâng cấp lên Mountain Lion và cập nhật Xcode. Tôi đã xóa git (bao gồm cả XCode) và thử cài đặt nó với homebrew. Điều đó không hiệu quả, vì vậy tôi đã gỡ bỏ nó và thử với gói cài đặt Mac được cung cấp của họ mà cũng không khắc phục được sự cố.

Beanstalk cung cấp các url SSH cho kho lưu trữ git, nhưng tôi không gặp vấn đề gì với việc kết nối qua SCP hoặc SSH đến các máy chủ mà tôi đã thực hiện.

Điều này đang giết chết quy trình làm việc của tôi vì vậy bất kỳ trợ giúp sẽ được đánh giá cao!

42
gabeb

VMware trên NAT có vấn đề này với tôi. Thay đổi nó thành Cầu nối (sao chép trạng thái) đã khắc phục sự cố.

20
Anand Rockzz

Hãy thử kiểm tra kết nối mạng của bạn. Có thể có một rác trong bảng định tuyến. Có thể cổng bị hỏng trên bộ định tuyến hoặc sự cố giao diện mạng của máy tính của bạn. Hãy thử ping máy chủ mà bạn đang nhân bản git repo, có thể liên kết giữa máy tính của bạn và máy chủ này không ổn định.

8
cjayho

Trông tương tự như vấn đề của tôi. Git dường như bị treo khi tìm nạp hoặc Đẩy sau một khoảng thời gian ngắn nhất định. Tôi có thể khuyên bạn nên đặt ~/.ssh/config:

Host *

ServerAliveInterval 60

Tôi có một MBP với Mountain Lion. Tôi hy vọng thời gian chờ này là nguyên nhân cho vấn đề của bạn. (Sau ba mươi hoặc bốn mươi phút hoặc lâu hơn, tôi nhận thấy rằng nó vẫn tiếp tục.)

7
driek

Trên Mac, git fetch phải có khả năng chống lại loại sự cố này hơn, với Git 2.22 (Q2 2019): Trên các nền tảng nơi "git fetch" bị giết bằng SIGPIPE (ví dụ OSX), _upload-pack_ chạy trên nền tảng khác kết thúc cúp máy sau khi phát hiện ra lỗi có thể khiến "_git fetch_" chết với tín hiệu, dẫn đến một bài kiểm tra hoàn mỹ.
[.__.] "_git fetch_" hiện bỏ qua SIGPIPE trong phần mạng hoạt động của nó (đây không phải là vấn đề khi chúng tôi kiểm tra trạng thái trả về từ ghi (2) của chúng tôi).

Xem cam kết 1435889 (03 tháng 3 năm 2019) và cam kết 37c8001 (05 tháng 3 năm 2019) bởi Jeff King (peff) .
(Được hợp nhất bởi Junio ​​C Hamano - gitster - in cam kết 27cdbdd , ngày 20 tháng 3 năm 2019)

fetch: bỏ qua SIGPIPE trong khi vận hành mạng

Hành vi SIGPIPE mặc định có thể hữu ích cho một lệnh tạo ra nhiều đầu ra: nếu người nhận đầu ra của chúng tôi biến mất, chúng tôi sẽ được thông báo không đồng bộ để ngừng tạo ra nó (thường là bằng cách giết chương trình).

Nhưng đối với một lệnh như fetch, chủ yếu liên quan đến việc nhận dữ liệu và ghi nó vào đĩa, một SIGPIPE bất ngờ có thể gây khó xử. Chúng tôi đã kiểm tra giá trị trả về của tất cả các cuộc gọi write() của chúng tôi và chết do tín hiệu sẽ lấy đi cơ hội của chúng tôi để xử lý lỗi một cách duyên dáng.

Trên Linux, chúng ta thường không thấy SIGPIPE trong quá trình tìm nạp. Nếu phía bên kia của kết nối mạng bị treo, chúng ta sẽ thấy ECONNRESET.
[.__.] Nhưng trên OS X, chúng tôi nhận được SIGPIPE và quá trình này bị hủy.

Chúng ta hãy bỏ qua SIGPIPE trong phần mạng tìm nạp, điều này sẽ khiến write() của chúng ta trả về EPIPE, cho chúng ta hành vi nhất quán trên các nền tảng.

2
VonC