Làm thế nào để hoàn thành một bản sao git cho một dự án lớn trên một kết nối không ổn định?


193

Tôi đang cố gắng sao chép mã cơ sở LibreScript, nhưng hiện tại tôi có kết nối internet khoảng 300kbps và nó chỉ là bất cứ thứ gì ngoài ổn định. Tôi có thể lấy lại kết nối bất cứ lúc nào, nhưng sau đó quá trình nhân bản git đã ngừng hoạt động và không có cách nào để nó chạy lại. Có cách nào để tải xuống bản sao git chống thất bại hơn không?

Một lựa chọn tôi tự xem xét là tải xuống thư mục .git của người khác, nhưng điều đó phụ thuộc quá nhiều vào người khác và dường như không phải là giải pháp tốt nhất có thể với tôi.


6
Bạn có cần sao chép tất cả các sửa đổi, hoặc chỉ mới nhất? Có lẽ depth -1là một giải pháp?
takeshin

1
Cách tiếp cận bó đã có sẵn cho repos như thế nào kernel/git/torvalds/linux.git. Và một bản sao git nối lại đang được thảo luận (tháng 3 năm 2016). Xem stackoverflow.com/a/29192890/6309 .
VonC

Tôi tự hỏi. Sẽ không làm git init, thiết lập một điều khiển từ xa và sau đó thực hiện tìm nạp cho đến khi nó thành công thực hiện các mẹo? Tôi không nghĩ rằng tìm nạp các đối tượng đã tải xuống thành công nếu kết nối không thành công.
Tiếng Pháp là

@ Tiếng Pháp có ai đã thử cái này không?
William Entriken

Câu trả lời:


71

Tôi không nghĩ rằng điều này đã sẵn sàng. Có một trang GSoC cũ có kế hoạch triển khai tính năng mong muốn của bạn. Đặt cược tốt nhất của tôi là, giống như bạn đề nghị tải nó dưới dạng một thư mục. Tôi giả sử bạn có thể tiếp tục tải xuống qua các giao thức khác.

Bản sao có thể khởi động lại

Khi nhân bản một kho lưu trữ lớn (như KDE, Open Office, nhân Linux), hiện tại không có cách nào để khởi động lại một bản sao bị gián đoạn. Có thể mất một thời gian đáng kể để người dùng ở cuối một ống nhỏ để tải xuống dữ liệu và nếu bản sao bị gián đoạn ở giữa, người dùng hiện cần phải bắt đầu lại từ đầu và thử lại. Đối với một số người dùng, điều này có thể làm cho không thể sao chép một kho lưu trữ lớn.

Mục tiêu: Cho phép git-clone tự động tiếp tục tải xuống thất bại trước đó qua giao thức git: // gốc. Ngôn ngữ: C Mentor: Shawn Pearce Được đề xuất bởi: Shawn Pearce trên gmane


Cập nhật

Cùng với git clone --depth=1gợi ý nhân bản nông ( ) trong một trong những câu trả lời khác, có thể hữu ích nếu ai đó có thể tạo một kho lưu trữ trống cho bạn nếu bạn có thể liên lạc với nhà cung cấp. Bạn có thể dễ dàng chuyển đổi kho lưu trữ trần thành kho lưu trữ đầy đủ. Cũng đọc các bình luận trong câu trả lời đó như một bản sao nông cạn có thể không luôn luôn giúp đỡ.


Cảm ơn thông tin, vì vậy vấn đề của tôi đã được biết và một giải pháp được thực hiện ... Bạn muốn giới thiệu điều gì khi giải quyết?
LaPingvino

9
Mới hôm qua, tôi đã mất 600 rupee (10 đô la) Vì vấn đề này. Băng thông Internet là điều khá quý giá trong Phần của tôi trên thế giới.
Amit Singh Tomar

2
Rất nhiều người yêu cầu cập nhật và không ai chia sẻ đóng góp của họ cho giải pháp.
William Entriken

2
Mar'18 - lukin cho nó vẫn ... trên trái đất này !!
đất

3
11 năm sau, cuộc tấn công của Google vào vấn đề kinh tế xã hội cơ bản về băng thông không đáng tin cậy với Google Fiber và Google Fi đã có kết quả trái chiều. Các rãnh vi sợi của nó ở thành phố Louisville đã bị cắt quá nông vào nhựa đường, và các dây cáp được tìm thấy bật ra khỏi mặt đường ngay sau khi làm việc. Trong khi đó, --depth 1--unshallowdường như đã chịu đựng được những năm sử dụng.
rwong

126

Hai giải pháp (hay đúng hơn là cách giải quyết ) xuất hiện trong tâm trí là:

  • Sử dụng nông bản sao tức git clone --depth=1, sau đó làm sâu sắc thêm bản sao này sử dụng git fetch --depth=N, với sự gia tăng N . Bạn có thể sử dụng git fetch --unshallow(kể từ 1.8.0.3) để tải xuống tất cả các phiên bản còn lại.

  • Yêu cầu ai đó gói lại một số bản phát hành được gắn thẻ (xem trang chủ git-bundle (1) ). Bản thân gói là một tệp thông thường, bạn có thể tải xuống bằng mọi cách, qua HTTP / FTP với hỗ trợ tiếp tục, qua BitTorrent, qua rsync, v.v. Bạn có thể tạo bản sao từ gói, sửa cấu hình và tìm nạp thêm từ kho lưu trữ chính thức của LibreOffice .


3
Thủ thuật nhân bản nông cạn không hoạt động tốt trong thực tế. Nhân bản một repo được đóng gói tốt (git: //libvirt.org/libvirt.git) thay đổi chuyển 68M thành chuyển khoản 61M + 35M. Một tính năng để ưu tiên cho bàn làm việc, thay vì tất cả các chi nhánh ở độ sâu 1, có thể có giá tốt hơn; nối lại phiên sẽ vẫn tốt hơn.
Tobu

1
@Tobu: Thủ thuật nhân bản nông có thể hoạt động trong kho lưu trữ với lịch sử lonG. Có công việc đang diễn ra để làm cho bản sao nông chỉ có được một nhánh duy nhất theo mặc định. Điều đó có thể đã giúp. Hay không.
Jakub Narębski

6
Điều này thực sự hoạt động tốt bây giờ, với git 1.7.10. Độ sâu ban đầu = 1 bản sao của kho Git chỉ 4,72Mb, trong khi toàn bộ kho là 55Mb. Các lần tìm nạp khác có thể nhỏ như bạn muốn, (độ sâu = 100 đã cho tôi một lần tìm nạp ~ 20Mb). Tổng số lượt tải xuống là 31Mb, qua một lần sao chép và 3 lần tải.
ness101

2
@ naught101 Nó tải xuống các đối tượng cho một lần sửa đổi và nếu bản thân mã nguồn lớn (không phải lịch sử), thì nó sẽ lại là một vấn đề ...
kan

1
for m in $(seq 1 50);do git fetch --depth=$[m*100];donelàm việc cho tôi, cảm ơn! :)
Trass3r

15

Phương pháp này sử dụng máy chủ của bên thứ 3.

Đầu tiên, làm git clone --bare, sau đó rsync -v -P -e ssh user@host:repo.git . Bạn có thể sử dụng msys trong Windows.


Tôi đã thử tùy chọn --bare, nó đã tạo ra nội dung dự kiến ​​của các tệp nội bộ .git bên trong repo.git, tôi đã phải thực hiện tệp git clone: ​​///path/to/repo.git/ để có được kho lưu trữ thực tế
PiyusG

1
Linus không sở hữu GitHub, bởi "máy chủ bên thứ 3", bạn có thực sự muốn nói là máy chủ của Git không giam giữ người dùng của nó nhiều đến mức cấm sử dụng rsync(1) theo cách mà GitHub đang nhìn vào bạn hay không? Hoặc, bạn có nghĩa là đầu tiên git clone trên máy chủ của bên thứ 3 và sau đó rsync nó với máy cục bộ?
JamesTheAwgieDude

12

" Không bao giờ đánh giá thấp băng thông của chim bồ câu và một gói thẻ SD " sẽ là hình thức hiện đại của câu trả lời này. Tar nó lên, đơn giản là cũ cp -a, bất cứ điều gì, và gửi những thứ chết tiệt. Tìm ai đó sẵn sàng dành hai phút thời gian của họ để thả một ngón tay cái vào một chiếc SASE. Tìm một liên lạc, ở đó, họ thậm chí có thể làm điều đó cho bạn.


9

Bạn có thể "tải xuống thư mục .git của người khác", nhưng với người khác là kho lưu trữ chính thức. Các kho lưu trữ LibreScript có sẵn thông qua http, ví dụ: chúng build.gitcó tại http://anongit.freedesktop.org/git/libreoffice/build.git/ (xem http://cgit.freedesktop.org/libreoffice/ để biết danh sách đầy đủ, URL http nằm ở cuối trang của mỗi kho lưu trữ).

Những gì bạn thấy tại các URL http này không gì khác hơn là một .gitthư mục (thực sự là một kho lưu trữ "trần", chỉ có những gì bạn sẽ tìm thấy trong .gitthư mục). Đó là cùng thư mục mà máy chủ cho git://giao thức ( git daemon) sẽ đọc. Nếu bạn tạo một bản sao của các thư mục này bằng trình tải xuống web (ví dụ wget -m -np), bạn có thể sao chép từ bản sao của mình và nó sẽ hoạt động tốt như bạn đã sao chép trực tiếp từ kho lưu trữ http.

Vì vậy, những gì bạn có thể làm là: đối với mỗi kho lưu trữ, hãy lấy một bản sao của nó với trình tải xuống web yêu thích của bạn (sẽ giải quyết tất cả các vấn đề với việc tiếp tục tải xuống bị hỏng) và sao chép từ bản sao đó. Khi bạn muốn cập nhật, hãy sử dụng lại trình tải xuống web yêu thích của bạn để cập nhật bản sao của bạn và lấy từ bản sao đó. Bây giờ bản sao và bản cập nhật của bạn có khả năng chống lại các kết nối xấu như trình tải xuống web yêu thích của bạn.


Họ đã thực hiện chuyển đổi thành chỉ một kho lưu trữ ngay bây giờ, tuy nhiên, mẹo của bạn đã quyết định tải xuống trang web cùng một lúc ... (thử lại ngay bây giờ, có thể sẽ cập nhật tại đây sau ...)
LaPingvino

Lệnh của bạn dường như nhận được tất cả các liên kết trên trang web, đó không phải là điều sẽ xảy ra. Tôi đã dùng đến để viết một kịch bản dường như hoạt động ở đây: gist.github.com/1307703 Dù sao, cảm ơn rất nhiều vì ý tưởng ban đầu!
LaPingvino

Ý tưởng thú vị, tôi đang cố gắng lấy repo ruby ​​/ ruby ​​từ github và tôi đang bị chặn bởi robot.txt ... có đề xuất nào không?
hanetzer

6

Hãy chia git clonenhỏ thành các bộ phận cấu thành của nó và sử dụng git checkoutđể ngăn tải lại các tệp.

Khi git clonechạy, một vài thứ đầu tiên nó tương đương với

git init
git remote add origin <repo_url>
git fetch origin <branch>

Nếu bạn chạy các bước trên một cách thủ công và giả sử rằng chúng đã hoàn thành chính xác, bây giờ bạn có thể chạy các bước sau nhiều lần nếu cần:

git checkout --force <branch>

Lưu ý rằng nó sẽ kiểm tra tất cả các tệp mỗi lần nó chạy, nhưng bạn sẽ không phải tải xuống lại các tệp , điều này có thể giúp bạn tiết kiệm rất nhiều thời gian.


1
nó không hoạt động theo cách bạn mô tả, nó sẽ không cho phép thiết lập lại git sau khi tìm nạp bị hỏng
MaikoID

Như tôi đã nói, một khi bạn cho rằng việc tìm nạp đã hoàn thành thành công, bạn có thể chạy thiết lập lại git. Nếu quá trình tìm nạp của bạn bị hỏng, thì thiết lập lại sẽ không hoạt động. Bạn cần phải A) liên tục cố gắng tìm nạp lại cho đến khi nó hoạt động hoặc B) từ bỏ cái này và thử cái khác.
chăn bò

Tôi đã làm một cái gì đó khác, nó làm việc kỳ diệu. Tôi đã thực hiện thao tác kéo git thay vì git fetch =)
MaikoID

@MaikoID Tôi tin rằng một git pull chỉ gọi git fetch trong nội bộ, sau đó hợp nhất, vì vậy lệnh nên ned đã tạo ra sự khác biệt
lucidbrot

4

Nếu bạn có quyền truy cập vào máy chủ của bên thứ 3, bạn có thể sao chép ở đó và sau đó sao chép.


4
git clone --depth <Number> <repository> --branch <branch name> --single-branch

Lệnh này giúp tôi (Cảm ơn Nicola Paolucci )

ví dụ

git clone --depth 1 https://github.com/gokhanmoral/siyahkernel3 --branch ics  --single-branch

4

Dựa trên các câu trả lời dựa trên bản sao / chiều sâu - một vài dòng bash được thực hiện dễ dàng ...

git clone --depth=1 something@somegit.com:/var/git/whatever.git <directory> cd <directory> for m in `seq 1 100`;do git fetch --depth=$m;done


Cảm ơn, có vẻ như nó hoạt động, tôi đang cố gắng sao chép Arduino, nó ở mức 25% với khoảng 800 MB, và nó đã bị hỏng. tải xuống trong các phần có vẻ an toàn hơn, nhưng có thể không cần ở các bước 1, có thể 10 hoặc 50 là tốt hơn, tùy thuộc vào cách cập nhật, hãy tưởng tượng 80 nghìn tệp, không nên viết ở độ sâu quá ít. Sử dụng: for m in seq 1 10 1000; do git pull --depth = $ m; thực hiện để có các bước 10. PS Nếu tôi làm Ctrl + CI chỉ mất gói hiện tại và tôi có thể bắt đầu lại
user3394963

3

Vấn đề này cắn tôi quá. Trong trường hợp của tôi có một công việc xung quanh. Nó có thể hoặc không thể áp dụng trong trường hợp của bạn.

Thỉnh thoảng tôi đang sử dụng điện thoại di động để bắt đầu các hoạt động git trên một hệ thống từ xa. Nếu wi-fi của tôi bị hỏng dĩ nhiên phiên kết thúc và git sẽ giảm toàn bộ hoạt động nhân bản mà không phục hồi. Nhưng vì kết nối internet từ hệ thống từ xa của tôi đến git master rất ổn định nên không cần phải sao chép. Tất cả những gì tôi cần là giao dịch để tách bản sao khỏi phiên cuối. Điều này có thể được thực hiện bằng cách sử dụng screen / tmux hoặc nohup / daemon. Vì vậy, đó là một sự cố phần mềm sống trong trường hợp của tôi.



2

Sử dụng CNTRL Z để dừng nhân bản. Không đóng thiết bị đầu cuối đặt hệ thống / máy tính xách tay ở chế độ ngủ đông và sau đó tiếp tục sau đó bằng lệnh fg. Tôi đã phải đối mặt với vấn đề tương tự ngày hôm nay trong khi cố gắng sao chép một github repo frm. Điều này đến như một tiết kiệm thời gian cho tôi.


1

Tôi muốn đặt 5 xu của tôi ở đây. Đây thực sự là những gì đã giúp tôi giải quyết vấn đề này

  • tắt nén
  • tăng http.postBuffer
  • làm một bản sao một phần
  • điều hướng đến thư mục nhân bản và tìm nạp phần còn lại của bản sao
  • kéo phần còn lại
git config --global core.compression 0
git config --global https.postBuffer 524288000
git clone  <your_git_http_url_here> --depth 1
git fetch --unshallow 
git pull --all

Điều này giúp tôi sao chép ~ 3GB repo qua kết nối adsl 8Mbps, tất nhiên tôi phải thực hiện tìm nạp và kéo vài lần, nhưng vẫn ...


1

Tăng kích thước bộ đệm sẽ giúp bạn trong vấn đề này. Chỉ cần làm theo các bước.

các bước:

1. Mở thiết bị đầu cuối hoặc Git Bash và với "cd" đi đến vị trí mà bạn muốn sao chép repo.

2.Đặt nén về 0

git config --global core.compression 0

3. Đặt kích thước postBuffer

git config --global http.postBuffer 1048576000

4. Đặt kích thước maxRequestBuffer

git config --global http.maxRequestBuffer 100M

5.Bây giờ bắt đầu nhân bản

git clone <repo url>

6.Đợi cho đến khi nhân bản hoàn tất.

Cảm ơn bạn. Chúc mừng mã hóa !!!


0

nếu chúng tôi cho rằng máy chủ có băng thông tốt (và bạn có máy chủ) thì một câu trả lời khác là:

  1. tạo máy chủ của riêng bạn sử dụng Server-Side Git Wrapper 's
  2. sao chép nó trong máy chủ của bạn
  3. Zip nó bằng cách sử dụng Zip Archiver của phía máy chủ
  4. tải xuống từ và với sự hỗ trợ Resume phía máy chủ

nhưng điều này chỉ hoạt động với kinh nghiệm phát triển Web rất cơ bản;) và bạn cũng cần git.exetrong máy chủ của mình


0

Vấn đề tương tự ở đây - Tôi có một kết nối internet thực sự không ổn định với tốc độ thường không quá 10-15 kb / giây :-P

Đối với tôi cách wget làm việc rất tốt. Đi đến trang kho lưu trữ có nút màu xanh lá cây "sao chép hoặc tải xuống", bấm vào đó và sao chép liên kết của tùy chọn tải xuống ZIP.

Sau đó chèn liên kết vào lệnh
wget : wget -c -m -np https://github.com/your/reposeective/archive/master.zip

Hoạt động như một bùa mê ...


0

cách giải quyết tốt nhất đã làm việc cho tôi:

tôi đã đối mặt với cùng một vấn đề với một kết nối internet xấu. Vì vậy, tôi đã đưa ra giải pháp sau đây:

Tạo một tệp php nhỏ trên máy chủ của tôi để tải xuống gói dưới dạng tệp zip:

<?php
$url = "https://codeload.github.com/CocoaPods/Specs/zip/master";
file_put_contents("coco.zip", fopen($url, 'r'));
?>  

<a href="coco.zip">coco.zip</a>

sau đó tải xuống tệp zip bằng bất kỳ trình quản lý tải xuống nào hỗ trợ sơ yếu lý lịch


-1

Bạn có thể thử sử dụng mercurial với phần mở rộng hg-git.

Nếu điều đó không hiệu quả, bạn có thể sử dụng git fetch <commit-id>để chỉ tìm nạp các phần của kho git từ xa (bạn có thể tìm nạp vào kho git trống, không cần phải tạo nó bằng bản sao). Nhưng bạn có thể sửa cấu hình nhánh (= tạo các nhánh theo dõi cục bộ và từ xa) khi bạn sử dụng phương pháp này.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.