จะปลอดภัยหรือไม่ที่จะทำการโคลนนิ่งตื้น ๆ --depth 1 สร้างคอมมิทและดึงการอัพเดตอีกครั้ง?


280

--depth 1ตัวเลือกในgit clone:

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

แต่ฉันได้ทำการโคลนแบบโคลนสำเร็จทำการเปลี่ยนแปลงบางอย่างและผลักดันการเปลี่ยนแปลงเหล่านั้นกลับไปยังจุดเริ่มต้น (โคลนเปล่า)

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

ฉันชอบความคิดตื้น ๆ ของโคลน - เช่น drupal core: ไม่มีทางที่ฉันจะต้องรู้ว่าเกิดอะไรขึ้นใน drupal 4 เมื่อฉันเริ่มต้นจาก 7 - แต่ฉันไม่ต้องการยิงตัวเองด้วยการเดินเท้า

ดังนั้นปลอดภัยหรือไม่ที่จะทำการโคลนแบบตื้นพัฒนาคอมมิทเข้าไปข้างในแล้วดึงอีกครั้งเพื่อให้ทันกับการอัพเดทจากที่มา?


13
นี่คือการอภิปรายที่ดีเกี่ยวกับความลึกของการโคลน
แอนดี้

ใช่ฉันอ่านแล้วก็ขอบคุณแอนดี้ --orphanแนวคิดดูเหมือนคล้ายกันและผมตั้งใจที่จะมีการเล่น ยังไม่แน่ใจว่าเอกสารไม่ตรงกับความเป็นจริง [เพราะใครจะบอกว่าเอกสาร--orphanนั้นถูกต้อง?!]
artfulrobot

พบอีกสนทนาที่ดีของการทำงานที่มีประวัติที่ถูกตัดทอน แต่มันก็ไม่ได้ช่วยอะไรฉัน
artfulrobot

1
Git 1.9 (ไตรมาสที่ 1 ปี 2014) จะสนับสนุนการโคลน repo อย่างเต็มขั้น! ดูคำตอบของฉันด้านล่าง
VonC

1
Git 2.5 (Q2 2558) รองรับการดึงข้อมูลครั้งเดียว! ฉันได้แก้ไขคำตอบของฉันอ้างอิง " ดึงการกระทำที่เฉพาะเจาะจงจากพื้นที่เก็บข้อมูล git ระยะไกล "
VonC

คำตอบ:


304

โปรดทราบว่า Git 1.9 / 2.0 (Q1 2014) ได้ลบข้อ จำกัด ดังกล่าวแล้ว
ดูคอมมิชชัน 82fba2bจากNguyễnTháiNgọc Duy ( pclouds) :

ตอนนี้ git รองรับการถ่ายโอนข้อมูลจากหรือไปยังโคลนตื้น ๆ ข้อ จำกัด เหล่านี้ไม่เป็นความจริงอีกต่อไป

เอกสารตอนนี้อ่าน :

--depth <depth>::

สร้างโคลน 'ตื้น' ที่มีประวัติถูกตัดให้เหลือจำนวนการแก้ไขที่ระบุ

ที่เกิดจากการกระทำเช่น0d7d285 , f2c681cและc29a7b8ซึ่งรองรับการโคลนส่งแพ็ค / รับแพ็คด้วย / จากโคลนตื้น
smart-http ในขณะนี้รองรับการดึงข้อมูล / โคลนแบบตื้นเช่นกัน

รายละเอียดทั้งหมดอยู่ใน " shallow.c: 8 ขั้นตอนในการเลือกคอมมิทใหม่สำหรับ.git/shallow "

อัปเดตมิถุนายน 2558: Git 2.5 จะยอมให้ทำการคอมมิตเพียงครั้งเดียว !
(กรณีตื้นที่สุด)


อัปเดตมกราคม 2559: Git 2.8 (Mach 2016) ในขณะนี้จัดทำเอกสารอย่างเป็นทางการเกี่ยวกับวิธีการรับประวัติขั้นต่ำ
ดูกระทำ 99487cf , กระทำ 9cfde9e (30 ธันวาคม 2015) กระทำ 9cfde9e (30 ธันวาคม 2015) กระทำ bac5874 (29 ธันวาคม 2015) และกระทำ 1de2e44 (28 ธันวาคม 2015) โดยสตีเฟ่นพีสมิ ธ ( ``)
(ผสานโดยJunio ​​C Hamano - gitster-ในการกระทำ 7e3e80a , 20 มกราคม 2016)

นี่คือ " Documentation/user-manual.txt"

A <<def_shallow_clone,shallow clone>>ถูกสร้างขึ้นโดยการระบุgit-clone --depthสวิตช์
ความลึกสามารถมาเปลี่ยนแปลงได้ด้วยสวิตช์หรือประวัติบูรณะด้วยgit-fetch --depth--unshallow

การผสานภายใน a <<def_shallow_clone,shallow clone>>จะทำงานได้ตราบใดที่ฐานผสานอยู่ในประวัติศาสตร์ล่าสุด
มิฉะนั้นจะเป็นเหมือนการรวมประวัติที่ไม่เกี่ยวข้องและอาจต้องทำให้เกิดความขัดแย้งอย่างมาก
ข้อ จำกัด นี้อาจทำให้ที่เก็บดังกล่าวไม่เหมาะสมที่จะใช้ในเวิร์กโฟลว์ที่ผสาน

อัปเดต 2020:

  • git 2.11.1 แนะนำตัวเลือกgit fetch --shallow-exclude=เพื่อป้องกันการดึงประวัติทั้งหมด
  • git 2.11.1 แนะนำตัวเลือกgit fetch --shallow-since=เพื่อป้องกันการดึงข้อมูลเก่า

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับกระบวนการอัพเดทโคลนตื้นดู " วิธีอัพเดทโคลนตื้น git "


ตามที่แสดงความคิดเห็นโดยRichard Michael :

ไปที่ประวัติโฆษณาทดแทน: git pull --unshallow

และOlle Härstedtเพิ่มความคิดเห็น :

เพื่อทดแทนส่วนหนึ่งgit fetch --depth=100ของประวัติศาสตร์:


3
มีข้อความมากมายที่จะพูดว่า " ใช่ตราบใดที่เวอร์ชันคอมไพล์ของคุณมีอายุไม่เกิน 4 ปีและฐานการผสานอยู่ในประวัติศาสตร์ล่าสุด"
Boris

3
@ Boris คำตอบนี้ช่วยฉันได้มากตั้งแต่ฉันสงสัยว่าใช้โคลนตื้น ๆ ก่อนหน้านี้มันหยุดพักบางครั้งเมื่อฉันทำการกระทำและผสาน คำตอบนี้เป็นประวัติโดยย่อว่าทำไมตอนนี้ถึงใช้ได้เมื่อมันเกิดขึ้นและวิธีการทำอย่างถูกต้อง
Yana Agun Siswanto

6

ดูคำตอบบางส่วนสำหรับคำถามที่คล้ายกันของฉันทำไมโคลน -i-push-from-a-ตื้น-cloneและลิงก์ไปยังเธรดล่าสุดในรายการ git

ในที่สุดการวัด 'ความลึก' ไม่สอดคล้องกันระหว่าง repos เพราะมันวัดจากหัวของแต่ละคนแทนที่จะเป็น (a) หัวหน้าของคุณหรือ (b) ความมุ่งมั่นที่คุณโคลน / ดึงกลับหรือ (c) อย่างอื่น คุณมีในใจ

ฮาร์ดไดรฟ์คือการใช้ Case ของตนเองถูกต้อง (นั่นคือสอดคล้องกับตัวเอง) ดังนั้นการกระจายและดังนั้น repos ที่แตกต่างอาจจะยังคงทำงานร่วมกันอย่างมีความสุข

ดูเหมือนว่าcheckout --orphanเป็น 'การตั้งค่า' ขั้นตอนที่ถูกต้อง แต่ยังขาดคำแนะนำ (เช่นคำสั่งบรรทัดเดียวที่เข้าใจง่าย) ในขั้นตอน "โคลน" แต่ดูเหมือนว่าคุณจะต้องinitซื้อคืนการตั้งค่าremoteสาขาการติดตาม (คุณต้องการสาขาเดียวเท่านั้น?) แล้วfetchสาขาเดียวที่รู้สึกยืดยาวกับโอกาสมากขึ้นสำหรับความผิดพลาด

แก้ไข: สำหรับขั้นตอน 'โคลน' ดูคำตอบนี้


1
รถถังฟิลิป การดึงสาขาระยะไกลจะยังคงดึงประวัติทั้งหมด (AFAIK) คุณพูดถูกเกี่ยวกับความลึกสัมพัทธ์ฉันต้องการจุดที่เหมาะสมในประวัติศาสตร์ (เช่น git merge-base 7.x 7.0 ในกรณีของฉัน)
artfulrobot

@artfulrobot: วิธีการ '--orphan' ช่วยให้คุณสร้าง 'clone' แคบ ๆ สั้น ๆ (เช่นเซ็กเมนต์ที่เน้น) แล้วใช้มันราวกับว่ามันเป็น repo ที่เหมาะสม มันเป็นสิ่งที่ฉันยังไม่ได้ลองด้วยความโกรธ แต่มันเป็นสิ่งที่ฉันต้องพิสูจน์ในไม่ช้า
Philip Oakley
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.