วิธีทำ git clone ให้สมบูรณ์สำหรับโครงการขนาดใหญ่บนการเชื่อมต่อที่ไม่เสถียร?


193

ฉันพยายามที่จะคอมไพล์รหัสฐานข้อมูล LibreOffice แต่ในขณะนี้ฉันมีการเชื่อมต่ออินเทอร์เน็ตประมาณ 300kbps และมันก็เป็นอะไรก็ได้ แต่เสถียร ฉันสามารถรับการเชื่อมต่อได้ตลอดเวลา แต่จากนั้นกระบวนการ git clone ก็หยุดทำงานและไม่มีวิธีที่จะทำให้มันทำงานอีกครั้ง มีวิธีการดาวน์โหลด git clone ที่ป้องกันความล้มเหลวมากกว่านี้ไหม?

ตัวเลือกหนึ่งที่ฉันคิดว่าตัวเองคือการดาวน์โหลดไดเรกทอรี. git ของคนอื่น แต่นั่นก็ขึ้นอยู่กับผู้อื่นมากเกินไปและดูเหมือนจะไม่เป็นทางออกที่ดีที่สุดสำหรับฉัน


6
คุณต้องการโคลนฉบับแก้ไขทั้งหมดหรือล่าสุดหรือไม่ อาจdepth -1จะเป็นทางออกหรือไม่
takeshin

1
วิธีมัดที่มีอยู่แล้วในสถานที่สำหรับ Repos kernel/git/torvalds/linux.gitเช่น และกำลังหารือเรื่องโคลนคอมไพล์ที่กลับมาทำงานได้อีกครั้ง (มีนาคม 2559) ดูstackoverflow.com/a/29192890/6309
VonC

ฉันสงสัยว่า จะไม่ทำgit initตั้งค่ารีโมทแล้วดึงข้อมูลจนกว่าจะทำเคล็ดลับได้สำเร็จหรือไม่ ฉันไม่คิดว่าจะดึงวัตถุที่ดาวน์โหลดสำเร็จแล้วออกหากการเชื่อมต่อล้มเหลว
АндрейБеньковский

@ АндрейБеньковскийเคยลองหรือไม่
William Entriken

คำตอบ:


71

ฉันยังไม่คิดว่ามันจะพร้อม มีหน้า GSoC เก่าซึ่งวางแผนที่จะใช้คุณลักษณะที่คุณต้องการ ทางออกที่ดีที่สุดของฉันคือคุณแนะนำให้ดาวน์โหลดมันเป็นไดเรกทอรี ฉันสมมติว่าคุณสามารถทำการดาวน์โหลดต่อบนโปรโตคอลอื่นได้

โคลนที่รีสตาร์ทได้

เมื่อทำการโคลนพื้นที่เก็บข้อมูลขนาดใหญ่ (เช่น KDE, Open Office, เคอร์เนล Linux) ในขณะนี้ยังไม่มีวิธีการรีสตาร์ทโคลนที่ถูกขัดจังหวะ อาจต้องใช้เวลาพอสมควรสำหรับผู้ใช้ที่ปลายท่อเล็ก ๆ เพื่อดาวน์โหลดข้อมูลและหากการโคลนถูกขัดจังหวะตรงกลางผู้ใช้ในปัจจุบันจำเป็นต้องเริ่มต้นใหม่ตั้งแต่ต้นแล้วลองอีกครั้ง สำหรับผู้ใช้บางรายสิ่งนี้อาจทำให้ไม่สามารถโคลนที่เก็บขนาดใหญ่

เป้าหมาย: อนุญาตให้ git-clone ทำการดาวน์โหลดต่อที่ล้มเหลวก่อนหน้านี้โดยอัตโนมัติผ่านโปรโตคอล git: // ดั้งเดิม ภาษา: C Mentor: Shawn Pearce แนะนำโดย: Shawn Pearce บน gmane


ปรับปรุง

พร้อมกับgit clone --depth=1ข้อเสนอแนะตื้นโคลน ( ) ในหนึ่งในคำตอบอื่น ๆ มันอาจจะเป็นประโยชน์ถ้ามีคนสามารถสร้างพื้นที่เก็บข้อมูลเปลือยสำหรับคุณถ้าคุณสามารถสื่อสารกับผู้ให้บริการ คุณสามารถแปลงพื้นที่เก็บข้อมูลเปลือยเป็นที่เก็บเต็ม อ่านความคิดเห็นในคำตอบด้วยว่าการโคลนตื้น ๆ อาจไม่ช่วยได้เสมอไป


ขอบคุณสำหรับข้อมูลดังนั้นปัญหาของฉันจึงเป็นที่รู้จักและมีวิธีแก้ไขปัญหา ... คุณจะแนะนำอะไรให้คุณหลีกเลี่ยง
LaPingvino

9
เมื่อวานนี้ฉันสูญเสียรูปีของฉัน 600 เหรียญ ($ 10) เนื่องจากปัญหานี้แบนด์วิดธ์อินเทอร์เน็ตเป็นสิ่งที่มีค่ามากในส่วนหนึ่งของโลก
Amit Singh Tomar

2
ผู้คนจำนวนมากร้องขอการอัปเดตและไม่มีใครแบ่งปันผลงานของพวกเขาในการแก้ปัญหา
William Entriken

2
Mar'18 - ลูคินยังคง ... บนโลกนี้ !!
มนุษย์พื้นดิน

3
11 ปีต่อมาการโจมตีของ Google ในเรื่องพื้นฐานทางสังคมและเศรษฐกิจของแบนด์วิดธ์ที่ไม่น่าเชื่อถือกับ Google Fiber และ Google Fi มีผลการผสมที่หลากหลาย เส้นใยขนาดเล็กของร่องลึกก้นสมุทรในเมืองหลุยส์วิลล์ถูกตัดลงไปในแอสฟัลต์อย่างตื้นเขินและสายเคเบิลก็โผล่ออกมาจากผิวถนนในไม่ช้าหลังเลิกงาน ในขณะเดียวกัน--depth 1และ--unshallowดูเหมือนจะทนต่อการใช้งานมานานหลายปี

126

การแก้ปัญหาสองวิธี (หรือค่อนข้างวิธีแก้ปัญหา ) ที่อยู่ในใจคือ

  • ใช้ตื้นโคลนเช่นgit clone --depth=1นั้นลึกมากขึ้นโคลนนี้โดยgit fetch --depth=Nมีการเพิ่มN คุณสามารถใช้git fetch --unshallow(ตั้งแต่ 1.8.0.3) เพื่อดาวน์โหลดการแก้ไขที่เหลือทั้งหมด

  • ขอให้ใครบางคนรวมกลุ่มกับรีลีสที่ติดแท็ก (ดูที่git-bundle (1) manpage) บันเดิลเองเป็นไฟล์ธรรมดาซึ่งคุณสามารถดาวน์โหลดได้ทุกทางผ่าน HTTP / FTP พร้อมการสนับสนุนการทำงานต่อผ่าน BitTorrent ผ่าน rsync ฯลฯ คุณสามารถสร้างโคลนจากบันเดิลแก้ไขการกำหนดค่าและดึงข้อมูลเพิ่มเติมจากที่เก็บ LibreOffice อย่างเป็นทางการ .


3
เคล็ดลับการโคลนแบบตื้นนั้นใช้งานไม่ได้ในทางปฏิบัติ การโคลน repo ที่บรรจุอย่างดี (git: //libvirt.org/libvirt.git) จะเปลี่ยนการถ่ายโอน 68M เป็นการถ่ายโอน 61M + 35M คุณลักษณะในการจัดลำดับความสำคัญของ worktree แทนที่จะเป็นทุกสาขาที่ระดับความลึก 1 อาจจะดีกว่า การเริ่มต้นเซสชันใหม่จะยังคงดีขึ้น
Tobu

1
@Tobu: เคล็ดลับการโคลนแบบตื้นอาจทำงานในที่เก็บที่มีประวัติ lonG มีงานอย่างต่อเนื่องที่จะทำให้โคลนตื้น ๆ ได้รับเพียงสาขาเดียวโดยค่าเริ่มต้น นั่นอาจช่วยได้ หรือไม่.
Jakub Narębski

6
ตอนนี้ใช้งานได้ดีจริง ๆกับ git 1.7.10 ความลึกเริ่มต้น = 1 โคลนของที่เก็บ Git เพียง 4.72Mb ในขณะที่ที่เก็บทั้งหมดคือ 55Mb การดึงข้อมูลเพิ่มเติมอาจมีขนาดเล็กตามที่คุณต้องการ (ความลึก = 100 ให้ฉัน fetche ~ 20Mb) การดาวน์โหลดที่ถูกบีบอัดทั้งหมดคือ 31Mb, มากกว่าหนึ่ง clone และ 3 fetches
naught101

2
@ naught101 มันดาวน์โหลดวัตถุสำหรับการแก้ไขครั้งเดียวและถ้าซอร์สโค้ดตัวเองมีขนาดใหญ่ (ไม่ใช่ประวัติ) จากนั้นมันจะเป็นปัญหาอีกครั้ง ...
kan

1
for m in $(seq 1 50);do git fetch --depth=$[m*100];doneทำงานให้ฉันขอบคุณ! :)
Trass3r

15

วิธีนี้ใช้เซิร์ฟเวอร์บุคคลที่สาม

ก่อนอื่นให้ทำ git clone --bareแล้ว rsync -v -P -e ssh user@host:repo.git . คุณสามารถใช้ msys ใน Windows


ฉันพยายาม - ตัวเลือกที่ไม่ดีมันสร้างเนื้อหาที่คาดหวังของ. git ไฟล์ภายใน repo.git ฉันต้องทำไฟล์ git clone: ​​///path/to/repo.git/ เพื่อรับที่เก็บจริง
PiyusG

1
Linus ไม่ได้เป็นเจ้าของ GitHub ... โดย "เซิร์ฟเวอร์ของบุคคลที่สาม" คุณหมายถึง "เซิร์ฟเวอร์ Git ที่ไม่ได้ล็อกผู้ใช้อย่างหนักเพื่อห้ามการใช้rsync(1) GitHub ที่ฉันมองมาที่คุณ " หรือคุณหมายถึงการเป็นอันดับแรกgit clone บนเซิร์ฟเวอร์ของบุคคลที่สามและจากนั้นซิงค์ไปยังเครื่องท้องถิ่นหรือไม่
JamesTheAwesomeDude

12

" อย่าประมาทแบนด์วิดท์ของนกพิราบผู้ให้บริการและการ์ด SD รวมกัน " จะเป็นรูปแบบที่ทันสมัยของคำตอบนี้ ทาน้ำมันขึ้นทาน้ำมันธรรมดา ๆcp -aทุกอย่างแล้วส่งเรื่องแช่ง หาคนที่เต็มใจสละเวลาสองนาทีเพื่อวาง thumb drive ลงใน SASE ค้นหาผู้ติดต่อที่นั่นพวกเขาอาจทำเพื่อคุณ


9

คุณสามารถ "ดาวน์โหลดไดเร็กตอรี่. git ของคนอื่น", แต่โดยที่คนอื่นเป็นที่เก็บข้อมูลอย่างเป็นทางการ ที่เก็บ LibreOffice มีให้บริการผ่าน http เช่นbuild.gitที่http://anongit.freedesktop.org/git/libreoffice/build.git/ (ดูที่http://cgit.freedesktop.org/libreoffice/)สำหรับรายการที่สมบูรณ์ http URL อยู่ที่ด้านล่างของหน้าของที่เก็บแต่ละแห่ง)

สิ่งที่คุณเห็นใน http URL เหล่านี้คืออะไรมากกว่า.gitไดเรกทอรี (ที่จริงแล้วเป็นที่เก็บ "เปล่า" ซึ่งมีเฉพาะสิ่งที่คุณจะพบใน.gitไดเรกทอรี) มันเป็นไดเรกทอรีเดียวกันกับเซิร์ฟเวอร์สำหรับgit://โปรโตคอล ( git daemon) ที่จะอ่าน หากคุณทำสำเนาของไดเรกทอรีเหล่านี้ด้วย web downloader (ตัวอย่างwget -m -np) คุณสามารถโคลนจากสำเนาของคุณและมันจะทำงานเช่นเดียวกับถ้าคุณโคลนโดยตรงจากที่เก็บ http

ดังนั้นสิ่งที่คุณสามารถทำได้คือ: สำหรับที่เก็บแต่ละอันให้รับสำเนาของมันกับเว็บดาวน์โหลดที่คุณชื่นชอบ (ซึ่งจะจัดการกับปัญหาทั้งหมดที่มีต่อการดาวน์โหลดที่ใช้งานไม่ได้) และคัดลอกจากสำเนานั้น เมื่อคุณต้องการอัปเดตให้ใช้ตัวดาวน์โหลดเว็บโปรดของคุณอีกครั้งเพื่ออัปเดตสำเนาของคุณและดึงจากสำเนานั้น ตอนนี้โคลนและการอัปเดตของคุณจะทนทานต่อการเชื่อมต่อที่ไม่ดีเท่าที่ดาวน์โหลดในเว็บที่คุณชื่นชอบ


พวกเขาทำการแปลงไปเป็นที่เก็บเดียวตอนนี้ลองใช้ทิปของคุณตัดสินใจที่จะดาวน์โหลดเว็บไซต์ในครั้งเดียว ... (ลองอีกครั้งตอนนี้อาจจะอัปเดตที่นี่ในภายหลัง ... )
LaPingvino

คำสั่งของคุณดูเหมือนจะได้รับลิงก์ทั้งหมดบนเว็บไซต์ซึ่งไม่ใช่สิ่งที่เกิดขึ้น ฉันใช้วิธีเขียนสคริปต์ที่ดูเหมือนว่าจะทำงานที่นี่: gist.github.com/1307703 อย่างไรก็ตามขอบคุณมากสำหรับแนวคิดเริ่มต้น!
LaPingvino

แนวคิดที่น่าสนใจฉันพยายามรับ repo ทับทิม / ทับทิมจาก github และฉันถูกบล็อกโดย robots.txt ... คำแนะนำใด ๆ
hanetzer

6

มาแบ่งย่อยgit cloneมันเป็นส่วนประกอบและใช้git checkoutเพื่อป้องกันการดาวน์โหลดไฟล์อีกครั้ง

เมื่อgit cloneทำงานสองสิ่งแรกที่มันเทียบเท่า

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

หากคุณเรียกใช้ขั้นตอนข้างต้นด้วยตนเองและสมมติว่าพวกเขาทำอย่างถูกต้องตอนนี้คุณสามารถเรียกใช้ต่อไปนี้ได้บ่อยเท่าที่จำเป็น:

git checkout --force <branch>

โปรดทราบว่ามันจะเช็คเอาต์ไฟล์ทั้งหมดทุกครั้งที่ทำงาน แต่คุณจะไม่ต้องดาวน์โหลดไฟล์อีกครั้งซึ่งอาจช่วยให้คุณประหยัดได้เป็นตัน


1
มันไม่ทำงานตามที่คุณอธิบายมันจะไม่อนุญาตให้ทำการตั้งค่า git หลังจากการเรียกคืนที่ขาด
MaikoID

ตามที่ฉันได้กล่าวไว้เมื่อคุณคิดว่าการดึงข้อมูลเสร็จสมบูรณ์คุณสามารถเรียกใช้การรีเซ็ต git ได้ หากการดึงข้อมูลของคุณเสียการรีเซ็ตจะไม่ทำงาน คุณต้อง A) พยายามดึงข้อมูลซ้ำ ๆ จนกว่าจะใช้งานได้หรือ B) ละทิ้งสิ่งนี้และลองอย่างอื่น
ประสานงาน

ฉันทำอย่างอื่นฉันก็ทำงานได้อย่างน่าอัศจรรย์ ฉันดึง git แทน git fetch =)
MaikoID

@MaikoID ฉันเชื่อว่าการดึงคอมไพล์เป็นเพียงการเรียก git ดึงภายในและจากนั้นจึงรวมคำสั่งควร
เน็ด


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

คำสั่งนี้ช่วยฉัน (ขอบคุณNicola Paolucci )

ตัวอย่างเช่น

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

4

การสร้างคำตอบตามโคลน / ความลึก - การทุบตีบางบรรทัดทำได้อย่างง่ายดาย

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


ขอบคุณดูเหมือนว่าจะทำงานฉันพยายามโคลน Arduino มันอยู่ที่ 25% ด้วยประมาณ 800MB และมันล้มเหลว การดาวน์โหลดในส่วนต่าง ๆ ดูเหมือนจะปลอดภัยกว่า แต่อาจไม่จำเป็นต้องอยู่ในขั้นตอนที่ 1 อาจจะ 10 หรือ 50 ดีกว่าขึ้นอยู่กับว่ามีการปรับปรุงอย่างไรลองนึกภาพ 80,000 ไฟล์ไม่ควรเขียนในระดับความลึกเพียงเล็กน้อย ใช้: สำหรับ m in seq 1 10 1000; git pull --depth = $ m; ทำเพื่อรับขั้นตอนที่ 10 PS ถ้าฉัน Ctrl + CI ทำแพ็คเกจปัจจุบันหายไปเท่านั้นและฉันสามารถเริ่มต้นใหม่ได้อีกครั้ง
user3394963

3

ปัญหานี้ก็กัดฉันเช่นกัน ในกรณีของฉันมีการแก้ไข อาจมีหรือไม่มีในกรณีของคุณ

บางครั้งฉันใช้โทรศัพท์มือถือเพื่อเริ่มการทำงานคอมไพล์ในระบบระยะไกล ถ้า Wi-Fi ของฉันหยุดลงเซสชั่นจะสิ้นสุดลงและคอมไพล์ก็จะทำการโคลนทั้งหมดโดยไม่ต้องกู้ แต่เนื่องจากการเชื่อมต่ออินเทอร์เน็ตจากระบบรีโมตของฉันไปยัง git master นั้นไม่จำเป็นต้องโคลนนิ่งเพื่อหยุด ทั้งหมดที่ฉันต้องการคือการแยกออกจากโคลนเทอร์มินัลเซสชัน สามารถทำได้โดยใช้ screen / tmux หรือ nohup / daemon ดังนั้นมันจึงเป็นความผิดพลาดของ liveware ในกรณีของฉัน



2

ใช้ CNTRL Z เพื่อหยุดการโคลน อย่าปิดเทอร์มินัลให้วางระบบ / แล็ปท็อปเข้าสู่โหมดไฮเบอร์เนตแล้วดำเนินการต่อในภายหลังโดยคำสั่ง fg ฉันกำลังเผชิญกับปัญหาเดียวกันนี้ในวันนี้ในขณะที่พยายามโคลน repo frm github นี่เป็นเวลาที่ประหยัดสำหรับฉัน


2

การเพิ่มขนาดบัฟเฟอร์จะช่วยคุณในปัญหานี้ เพียงทำตามขั้นตอน

ขั้นตอน

1. เปิดเทอร์มินัลหรือ Git Bash และด้วย "cd" ไปที่ตำแหน่งที่คุณต้องการโคลน repo

2. ตั้งค่าการบีบอัดเป็น 0

git config --global core.compression 0

3. ชุด postBuffer ขนาด

git config --global http.postBuffer 1048576000

4. ตั้งค่า maxRequestBuffer ขนาด

git config --global http.maxRequestBuffer 100M

5. เริ่มการโคลน

git clone <repo url>

6. รอจนโคลนเสร็จสมบูรณ์

ขอบคุณ. Happy Coding !!!


นี่ควรเป็นคำตอบที่ได้รับการยอมรับอย่างแน่นอน มันแก้ปัญหาได้
SuperEye

1

ฉันอยากจะใส่ 5 เซ็นต์ของฉันที่นี่ นี่คือสิ่งที่ช่วยให้ฉันแก้ไขปัญหานี้ได้จริง

  • ปิดการบีบอัด
  • เพิ่ม http.postBuffer
  • ทำโคลนบางส่วน
  • นำทางไปยังไดเรกทอรีโคลนและดึงส่วนที่เหลือของโคลน
  • ดึงที่เหลือ
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

สิ่งนี้ช่วยให้ฉันโคลน ~ 3GB repo ผ่านการเชื่อมต่อ adsl 8Mbps แน่นอนว่าฉันต้องทำการดึงและดึงสองสามครั้ง แต่ยัง ...


0

ถ้าเราถือว่าเซิร์ฟเวอร์มีแบนด์วิดท์ที่ดี (และคุณมีเซิร์ฟเวอร์) อีกคำตอบคือ:

  1. สร้างเซิร์ฟเวอร์ของคุณเองโดยใช้Git Wrapperฝั่งเซิร์ฟเวอร์ 's
  2. โคลนมันในเซิร์ฟเวอร์ของคุณ
  3. ไปรษณีย์โดยใช้ฝั่งเซิร์ฟเวอร์Zip Archiver 's
  4. ดาวน์โหลดจากและด้วยการสนับสนุน Resumeฝั่งเซิร์ฟเวอร์

แต่ใช้งานได้กับประสบการณ์การพัฒนาเว็บขั้นพื้นฐานเท่านั้น;) และคุณต้องใช้git.exeในการตัด


0

ปัญหาเดียวกันที่นี่ - ฉันมีการเชื่อมต่ออินเทอร์เน็ตที่ไม่สม่ำเสมอด้วยบ่อย ๆ ไม่เกิน 10-15 kb / วินาที :-P

สำหรับฉันวิธี wget ทำงานได้ดีมาก ไปที่ไซต์พื้นที่เก็บข้อมูลที่มีปุ่มสีเขียว "โคลนหรือดาวน์โหลด" คลิกและคัดลอกลิงก์ของตัวเลือกดาวน์โหลด ZIP

จากนั้นแทรกลิงก์ไปที่คำสั่ง
wget : wget -c -m -np https://github.com/your/repository/archive/master.zip

ทำงานเหมือนจับใจ ...


0

วิธีแก้ปัญหาที่ดีที่สุดที่ทำงานสำหรับฉัน:

ฉันประสบปัญหาเดียวกันกับการเชื่อมต่ออินเทอร์เน็ตที่ไม่ดี ดังนั้นฉันจึงคิดวิธีแก้ปัญหาต่อไปนี้:

สร้างไฟล์ php ขนาดเล็กบนเซิร์ฟเวอร์ของฉันเพื่อดาวน์โหลดแพ็คเกจเป็นไฟล์ 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>

จากนั้นดาวน์โหลดไฟล์ zip โดยใช้ตัวจัดการการดาวน์โหลดที่รองรับการทำงานต่อ


-1

คุณสามารถลองใช้ mercurial ด้วยส่วนขยาย hg-git

หากยังไม่ได้ผลคุณสามารถใช้git fetch <commit-id>เพื่อดึงข้อมูลบางส่วนของที่เก็บรีโมต Git เท่านั้น (คุณสามารถดึงข้อมูลลงในที่เก็บ Git ที่ว่างเปล่าไม่จำเป็นต้องสร้างมันด้วยโคลน) แต่คุณอาจแก้ไขการกำหนดค่าสาขา (= สร้างสาขาการติดตามในพื้นที่และระยะไกล) เมื่อคุณใช้วิธีการนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.