Bagaimana cara menyelesaikan klon git untuk proyek besar dengan koneksi yang tidak stabil?


193

Saya mencoba untuk mengkloning basis kode LibreOffice, tetapi saat ini saya memiliki koneksi internet sekitar 300kbps dan itu sama sekali tidak stabil. Saya bisa mendapatkan koneksi kembali kapan saja, tetapi kemudian proses klon git sudah berhenti bekerja, dan tidak ada cara untuk membuatnya berjalan lagi. Apakah ada cara untuk mengunduh git clon yang lebih tahan terhadap kegagalan?

Salah satu opsi yang saya anggap sendiri adalah mengunduh direktori .git orang lain, tetapi itu terlalu bergantung pada orang lain dan sepertinya bukan solusi terbaik bagi saya.


6
Apakah Anda perlu mengkloning semua revisi, atau hanya yang terbaru? Mungkin depth -1solusinya?
takeshin

1
Pendekatan bundel sudah tersedia untuk repo seperti kernel/git/torvalds/linux.git. Dan klon git yang dapat dilanjutkan sedang dibahas (Maret 2016). Lihat stackoverflow.com/a/29192890/6309 .
VonC

Aku penasaran. Tidak akan melakukan git init, mengatur remote dan kemudian melakukan pengambilan sampai berhasil melakukan triknya? Saya tidak berpikir mengambil sampah berhasil mengunduh objek jika koneksi gagal.
Андрей Беньковский

@ АндрейБеньковский adakah yang pernah mencoba ini?
William Entriken

Jawaban:


71

Saya kira ini belum siap. Ada halaman GSoC lama yang berencana mengimplementasikan fitur yang Anda inginkan. Taruhan terbaik saya adalah, seperti yang Anda sarankan unduh sebagai direktori. Saya berasumsi Anda dapat melanjutkan unduhan melalui protokol lain.

Clone yang Dapat Dipulihkan

Ketika mengkloning repositori besar (seperti KDE, Open Office, kernel Linux) saat ini tidak ada cara untuk memulai kembali klon yang terganggu. Diperlukan waktu yang lama bagi pengguna di ujung pipa kecil untuk mengunduh data, dan jika klon terputus di tengah, pengguna saat ini harus memulai dari awal dan mencoba lagi. Untuk beberapa pengguna ini mungkin membuat tidak mungkin untuk mengkloning repositori besar.

Sasaran: Izinkan git-klon untuk melanjutkan secara otomatis unduhan yang sebelumnya gagal melalui protokol asli git: //. Bahasa: C Mentor: Shawn Pearce Disarankan oleh: Shawn Pearce on gmane


Memperbarui

Seiring dengan git clone --depth=1saran kloning dangkal ( ) di salah satu jawaban lain, akan sangat membantu jika seseorang dapat membuat repositori kosong untuk Anda jika Anda dapat berkomunikasi dengan penyedia. Anda dapat dengan mudah mengonversi repositori kosong ke repositori penuh. Baca juga komentar dalam jawaban itu karena klon yang dangkal mungkin tidak selalu membantu.


Terima kasih atas informasinya, sehingga masalah saya diketahui dan solusinya sedang dikerjakan ... Apa yang akan Anda rekomendasikan sebagai solusi?
LaPingvino

9
Nah baru kemarin, saya Kehilangan 600 rupee ($ 10) karena Masalah ini. Bandwidth Internet adalah hal yang cukup berharga di Bagian dunia saya.
Amit Singh Tomar

2
Banyak orang yang meminta pembaruan dan tidak ada yang membagikan kontribusi mereka ke solusi.
William Entriken

2
18 Mar - lukin untuk itu masih ... di bumi ini !!
penduduk bumi

3
11 tahun kemudian, serangan Google pada masalah sosial ekonomi yang mendasari bandwidth tidak dapat diandalkan dengan Google Fiber dan Google Fi memiliki hasil yang beragam. Parit mikro seratnya di kota Louisville dipotong terlalu dangkal ke aspal, dan kabel-kabel ditemukan keluar dari permukaan jalan segera setelah bekerja. Sementara itu, --depth 1dan --unshallowtampaknya telah bertahan bertahun-tahun penggunaan.
rwong

126

Dua solusi (atau lebih tepatnya penyelesaian ) yang muncul di pikiran adalah:

  • Gunakan dangkal clone yaitu git clone --depth=1, kemudian memperdalam clone ini menggunakan git fetch --depth=N, dengan meningkatnya N . Anda dapat menggunakan git fetch --unshallow(sejak 1.8.0.3) untuk mengunduh semua revisi yang tersisa.

  • Minta seseorang untuk membundel ke beberapa rilis yang ditandai (lihat manual git-bundle (1) ). Bundel itu sendiri adalah file biasa, yang dapat Anda unduh dengan cara apa pun, melalui HTTP / FTP dengan dukungan resume, melalui BitTorrent, melalui rsync, dll. Anda dapat membuat klon dari bundel, memperbaiki konfigurasi, dan melakukan pengambilan lebih lanjut dari repositori LibreOffice resmi .


3
Trik klon dangkal tidak bekerja dengan baik dalam praktek. Mengkloning repo yang dikemas dengan baik (git: //libvirt.org/libvirt.git) mengubah transfer 68M menjadi transfer 61M + 35M. Fitur untuk memprioritaskan meja kerja, daripada semua cabang di kedalaman 1, mungkin lebih baik; pembukaan kembali sesi akan lebih baik lagi.
Tobu

1
@Tobu: Trik kloning dangkal mungkin berfungsi dalam repositori dengan riwayat lonG. Ada pekerjaan yang sedang berlangsung untuk membuat klon dangkal hanya mendapatkan satu cabang secara default. Itu mungkin bisa membantu. Atau tidak.
Jakub Narębski

6
Ini berfungsi dengan sangat baik sekarang, dengan git 1.7.10. Kedalaman awal = 1 klon dari repositori Git hanya 4.72Mb, sedangkan keseluruhan repositori adalah 55Mb. Pengambilan lebih lanjut bisa sekecil yang Anda inginkan, (kedalaman = 100 memberi saya ~ 20Mb fetche). Total unduhan terkompresi adalah 31Mb, lebih dari satu klon dan 3 pengambilan.
naught101

2
@ naught101 Ia mengunduh objek untuk satu revisi, dan jika kode sumbernya sendiri besar (bukan sejarah), maka itu akan menjadi masalah lagi ...
kan

1
for m in $(seq 1 50);do git fetch --depth=$[m*100];donebekerja untuk saya, terima kasih! :)
Trass3r

15

Metode ini menggunakan server pihak ke-3.

Pertama, lakukan git clone --bare, maka rsync -v -P -e ssh user@host:repo.git . Anda dapat menggunakan msys di Windows.


Saya mencoba opsi --bare, itu menciptakan isi yang diharapkan dari file internal .git di dalam repo.git, saya harus melakukan file klon git: ///path/to/repo.git/ untuk mendapatkan repositori yang sebenarnya
PiyusG

1
Linus tidak memiliki GitHub … oleh "server pihak ke-3", apakah Anda benar-benar bermaksud "server Git yang tidak memenjarakan penggunanya sedemikian rupa sehingga melarang penggunaannya rsync(1) dengan cara GitHub saya melihat Anda "? Atau, apakah maksud Anda pertama-tama git clone pada server pihak ketiga dan kemudian rsync ke mesin lokal?
JamesTheAwesomeDude


9

Anda dapat "mengunduh direktori .git orang lain", tetapi dengan itu orang lain menjadi repositori resmi itu sendiri. Repositori LibreOffice tersedia melalui http, misalnya mereka build.gitada di http://anongit.freedesktop.org/git/libreoffice/build.git/ (lihat http://cgit.freedesktop.org/libreoffice/ untuk daftar selengkapnya, URL http ada di bagian bawah setiap halaman repositori).

Apa yang Anda lihat di URL http ini tidak lebih dari sebuah .gitdirektori (sebenarnya repositori "telanjang", yang hanya memiliki apa yang akan Anda temukan di .gitdirektori). Ini adalah direktori yang sama dengan yang dibaca oleh server untuk git://protokol ( git daemon). Jika Anda membuat salinan direktori ini dengan pengunduh web (misalnya wget -m -np), Anda dapat mengkloning dari salinan Anda dan itu akan berfungsi juga jika Anda telah mengkloning langsung dari repositori http.

Jadi, yang dapat Anda lakukan adalah: untuk setiap repositori, dapatkan salinannya dengan pengunduh web favorit Anda (yang akan menangani semua masalah dengan melanjutkan kembali unduhan yang rusak), dan tiruan dari salinan itu. Saat Anda ingin memperbarui, gunakan lagi pengunduh web favorit Anda untuk memperbarui salinan Anda, dan tarik dari salinan itu. Sekarang klon dan pembaruan Anda tahan terhadap koneksi yang buruk seperti pengunduh web favorit Anda.


Mereka membuat konversi ke hanya satu repositori sekarang, mencoba tip Anda, tetapi memutuskan untuk mengunduh situs sekaligus ... (coba lagi sekarang, mungkin akan memperbarui di sini nanti ...)
LaPingvino

Perintah Anda tampaknya mendapatkan semua tautan di situs, yang tidak dimaksudkan untuk terjadi. Saya terpaksa menulis skrip yang sepertinya berfungsi di sini: gist.github.com/1307703 Bagaimanapun, terima kasih banyak untuk ide awalnya!
LaPingvino

Ide yang menarik, saya mencoba mendapatkan repo ruby ​​/ ruby ​​dari github dan saya diblokir oleh robots.txt ... ada saran?
hanetzer

6

Mari kita memecah git clonemenjadi bagian-bagian komponen itu, dan gunakan git checkoutuntuk mencegah mengunduh ulang file.

Saat git clonedijalankan, beberapa hal pertama yang dilakukannya setara

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

Jika Anda menjalankan langkah-langkah di atas secara manual, dan dengan asumsi mereka telah menyelesaikannya dengan benar, Anda sekarang dapat menjalankan yang berikut ini sebanyak yang diperlukan:

git checkout --force <branch>

Perhatikan bahwa ini akan memeriksa semua file setiap kali dijalankan, tetapi Anda tidak perlu mengunduh ulang file , yang dapat menghemat banyak waktu.


1
itu tidak bekerja seperti yang Anda gambarkan, itu tidak akan memungkinkan untuk melakukan git reset setelah pengambilan yang rusak
MaikoID

Seperti yang saya katakan, setelah Anda menganggap bahwa pengambilan telah selesai dengan sukses, Anda dapat menjalankan git reset. Jika pengambilan Anda rusak, maka reset tidak akan berhasil. Anda perlu A) berulang kali mencoba mengambil lagi sampai berfungsi, atau B) meninggalkan ini dan mencoba sesuatu yang lain.
cowlinator

Saya melakukan sesuatu yang lain. Ajaibnya itu berhasil. Saya melakukan git pull bukan git fetch =)
MaikoID

@MaikoID Saya percaya git pull hanya memanggil git fetch internal, dan kemudian bergabung, jadi perintah seharusnya ned telah membuat perbedaan
lucidbrot

4

Jika Anda memiliki akses ke server pihak ketiga, Anda bisa mengkloning di sana dan kemudian menyalin.


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

Perintah ini membantu saya (Terima kasih kepada Nicola Paolucci )

sebagai contoh

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

4

Membangun berdasarkan jawaban klon / kedalaman - beberapa baris bash menyelesaikan ini dengan mudah ...

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


Terima kasih, sepertinya berhasil, saya mencoba mengkloning Arduino, 25% dengan sekitar 800MB, dan crash. mengunduh di bagian tampaknya lebih aman, tetapi mungkin tidak perlu dalam langkah 1, mungkin 10 atau 50 lebih baik, tergantung pada bagaimana itu diperbarui, bayangkan 80 ribu file, tidak boleh ditulis dalam kedalaman begitu sedikit. Menggunakan: untuk m di seq 1 10 1000; lakukan git pull --depth = $ m; dilakukan untuk mendapatkan langkah-langkah 10. PS Jika saya melakukan Ctrl + CI kehilangan paket saat ini saja, dan saya bisa mulai dari awal lagi
user3394963

3

Masalah ini menggigit saya juga. Dalam kasus saya ada penyelesaian. Ini mungkin atau mungkin tidak berlaku dalam kasus Anda.

Saya menggunakan ponsel kadang-kadang untuk memulai operasi git pada sistem jarak jauh. Jika wi-fi saya rusak tentu saja sesi berakhir dan git menjatuhkan seluruh operasi klon tanpa pulih. Tapi karena koneksi internet dari sistem remote saya ke git master solid, klon tidak perlu berhenti. Yang saya butuhkan adalah akal sehat untuk melepaskan klon dari sesi terminal. Ini dapat dilakukan dengan menggunakan layar / tmux atau nohup / daemon. Jadi ini merupakan kegagalan fungsi perangkat hidup dalam kasus saya.



2

Gunakan CNTRL Z untuk menghentikan kloning. Jangan tutup terminal, letakkan sistem / laptop dalam mode hibernasi dan kemudian lanjutkan dengan perintah fg. Saya menghadapi masalah yang sama hari ini ketika mencoba untuk mengkloning repo frm github. Ini datang sebagai penghemat waktu bagi saya.


2

Meningkatkan ukuran buffer akan membantu Anda dalam masalah ini. Ikuti saja langkah-langkahnya.

Langkah:

1. Buka terminal atau Git Bash dan dengan "cd" pergi ke lokasi di mana Anda ingin mengkloning repo.

2. Atur kompresi ke 0

git config --global core.compression 0

3. Atur ukuran postBuffer

git config --global http.postBuffer 1048576000

4. Atur ukuran maxRequestBuffer

git config --global http.maxRequestBuffer 100M

5. Sekarang mulai klon

git clone <repo url>

6.Tunggu sampai klon selesai.

Terima kasih. Selamat Coding !!!


Ini seharusnya menjadi jawaban yang diterima. Ini memecahkan masalah.
SuperEye

1

Saya ingin menaruh 5 sen saya di sini. Inilah yang sebenarnya membantu saya memecahkan masalah ini

  • matikan kompresi
  • tingkatkan http.postBuffer
  • lakukan tiruan parsial
  • arahkan ke direktori yang dikloning dan ambil klon yang tersisa
  • tarik sisanya
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

Ini membantu saya untuk mengkloning ~ 3GB repo melalui koneksi adsl 8Mbps, tentu saja saya harus melakukan pengambilan dan tarik beberapa kali, tetapi masih ...


0

jika kami menganggap server memiliki lebar pita yang baik (dan Anda memiliki server) jawaban lain adalah:

  1. buat server Anda sendiri menggunakan Server-Side Git Wrapper 's
  2. clone di server Anda
  3. Zip itu menggunakan Server-Side Zip Archiver 's
  4. unduh dari dan dengan dukungan Server-Side Resume

tetapi ini hanya bekerja dengan pengalaman pengembangan web yang sangat mendasar;) dan juga Anda butuhkan git.exedi server Anda


0

Masalah yang sama di sini - Saya memiliki koneksi internet yang sangat rapuh dengan sering tidak lebih dari 10-15 kb / detik :-P

Bagi saya cara wget bekerja dengan sangat baik. Buka situs repositori tempat tombol hijau "clone or download" berada, klik dan salin tautan opsi unduhan ZIP.

Kemudian masukkan tautan ke perintah
wget : wget -c -m -np https://github.com/your/repository/archive/master.zip

Bekerja seperti pesona ...


0

solusi terbaik yang berhasil untuk saya:

Saya menghadapi masalah yang sama dengan koneksi internet yang buruk. Jadi saya datang dengan solusi berikut:

Membuat file php kecil di server saya untuk mengunduh paket sebagai file 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>

kemudian unduh file zip menggunakan manajer unduhan yang mendukung resume


-1

Anda dapat mencoba menggunakan lincah dengan ekstensi hg-git.

Jika itu tidak berhasil, Anda dapat menggunakan git fetch <commit-id>untuk mengambil hanya bagian dari repositori git jarak jauh (Anda dapat mengambil ke dalam repositori git kosong, tidak perlu membuatnya dengan klon). Tetapi Anda mungkin memperbaiki konfigurasi cabang (= membuat cabang pelacakan lokal dan jarak jauh) ketika Anda menggunakan pendekatan ini.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.