git โคลนนิ่งตื้น (โคลน - ความลึก) คิดถึงสาขาระยะไกล


103

หลังจากโคลนที่เก็บระยะไกลแล้วจะไม่แสดงสาขาระยะไกลโดยอ็อพชัน -a อะไรคือปัญหา? จะแก้จุดบกพร่องได้อย่างไร? ในตัวอย่างนี้สองสาขาระยะไกลจะไม่แสดง:

$ git clone --depth 1 git://git.savannah.gnu.org/pythonwebkit.git
$ cd pythonwebkit
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master
$ git --version
git version 1.8.3.1

ลองใช้คำสั่งเดียวกันกับเครื่องอื่นมันทำงานได้ดี:

$ git clone --depth 1 git://git.savannah.gnu.org/pythonwebkit.git
Receiving objects: 100% (186886/186886), 818.91 MiB | 3.44 MiB/s, done.
$ cd pythonwebkit/
$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/debian
  remotes/origin/master
  remotes/origin/python_codegen
$ git --version
git version 1.7.1

พยายามโคลน repo อื่นด้วยก็ใช้ได้ดี แม้ว่าฉันจะลองบนเครื่องนี้อีกครั้ง แต่มันจะดีกว่าถ้ารู้ว่ามีอะไรผิดปกติ

ข้อเสนอแนะหรือคำแนะนำใด ๆ ยินดีต้อนรับ

แก้ไข: สรุปคำตอบ: เนื่องจาก git เวอร์ชัน 1.8.3.2 จะต้องใช้ "--depth" และ "--no-single-branch" ร่วมกันเพื่อให้ได้ลักษณะการทำงานเหมือนเดิม นี่ถือเป็นการแก้ไขข้อบกพร่อง


3
masterเป็นสาขาในพื้นที่ของคุณ remotes/origin/masterคือสาขาระยะไกลที่เกี่ยวข้อง คำถามคืออะไรกันแน่?
michas

1
บางทีคุณอาจลืมคำฟุ่มเฟือย? ลองgit branch -avv
jthill

สำหรับ michas และอื่น ๆ : เรามักจะไม่อ้างถึง master เป็นสาขาขออภัยในความสับสน เพิ่ม "สองสาขาระยะไกลไม่แสดง" ถึง jthill: ขอบคุณที่เตือนคุณถูกต้อง
minghua

1
ขอบคุณที่แนะนำgit clone --depth=1 --no-single-branchนี่คือสิ่งที่ฉันต้องการในกรณีส่วนใหญ่
Alireza Mohamadi

คำตอบ:


62

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

florianb$ git branch -a
        * master
          remotes/origin/HEAD -> origin/master
          remotes/origin/master

โคลนเต็มมีสาขาใหม่ (ทั้งหมด):

florianb$ git branch -a
        * master
          remotes/origin/HEAD -> origin/master
          remotes/origin/debian
          remotes/origin/master
          remotes/origin/python_codegen

โคลนตื้น

เนื่องจากคำอธิบายตื้น ๆในเอกสารทางเทคนิค " git-clone --depth 20 repo[... ] ผลลัพธ์ [s in] คอมมิตโซ่ที่มีความยาวไม่เกิน 20" ดังนั้นโคลนตื้นควรมีความลึกของการคอมมิตที่ร้องขอจากปลายกิ่ง

ในฐานะ - นอกจากนี้ - เอกสารgit cloneสำหรับ--single-branch-option อธิบาย:

"โคลนเฉพาะประวัติที่นำไปสู่ส่วนปลายของสาขาเดียวไม่ว่าจะระบุโดย--branchตัวเลือกหรือHEADจุดของรีโมตสาขาหลักที่เมื่อสร้างโคลนตื้นโดยใช้--depthตัวเลือกนี้จะเป็นค่าเริ่มต้นเว้นแต่--no-single-branchจะได้รับเพื่อดึงประวัติที่อยู่ใกล้ ทีเด็ดทุกสาขา

ดังนั้นการโคลนแบบตื้น(ที่มีตัวเลือกความลึก ) จะดึงข้อมูลเพียงสาขาเดียวเท่านั้น(ตามระดับความลึกที่คุณร้องขอ)


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


1
florianb: เวอร์ชันคอมไพล์ของคุณคืออะไร? ขอบคุณที่ทดลองใช้ ฉันทำ - ความลึก 1 ใน 1.7.1 ตอนนี้มันแสดงสาขาระยะไกลทั้งหมด อัปเดตคำถามด้วยสิ่งนี้ +1 สำหรับการตรวจสอบปัญหา
minghua

1
@minghua: ฉันใช้ 1.8.4 - ฉันจะทำการตรวจสอบเล็กน้อยว่ามีการแก้ไขในปัญหานั้นหรือไม่
Florian Neumann

1
@minghua: ฉันแก้ไขเพื่อสะท้อนการค้นพบใหม่เกี่ยวกับ "โคลนนิ่งตื้น"
Florian Neumann

1
เกือบจะสมบูรณ์แบบยกเว้นเพียงสิ่งเดียว: การพูดว่า "เจ้าของรีโพจึงตัดสินใจตัดสาขาอื่นออก" หมายความว่าอย่างไร ผมคิดว่าสาขาเหล่านั้นยังอยู่
minghua

2
- ไม่มีสาขาเดียวยังโคลนแท็กทั้งหมด เราสามารถหลีกเลี่ยงสิ่งนั้นได้โดยการสร้าง repo ใหม่โดยใช้ config เดียวกันเพื่อดึงข้อมูลรีโมตทั้งหมดเช่นfetch = +refs/heads/*:refs/remotes/origin/*และรันgit fetch --depth 1(โดยไม่มี--tags) fetch = +refs/tags/v2.0.0:refs/tags/v2.0.0นอกจากนี้เรายังสามารถเพิ่มแท็กที่เฉพาะเจาะจงที่จะดึงข้อมูลโดยใช้การตั้งค่าเช่น
Sam Watkins

218

หลังจากทำการโคลนตื้นเพื่อให้สามารถชำระเงินสาขาอื่นจากระยะไกลได้ได้

  1. Run (ขอบคุณ @jthill):

    git remote set-branches origin '*'
    
  2. หลังจากนั้นให้ทำ git fetch -v

  3. สุดท้าย git checkout the-branch-i-ve-been-looking-for


ขั้นตอนที่ 1 สามารถทำได้ด้วยตนเองโดยการแก้ไข .git/configนอกจากนี้ยังสามารถทำได้ด้วยตนเองโดยการแก้ไข

ตัวอย่างเช่นเปลี่ยนบรรทัดต่อไปนี้จาก:

fetch = +refs/heads/master:refs/remotes/origin/master

เพื่อ (แทนที่masterด้วย*):

fetch = +refs/heads/*:refs/remotes/origin/*

59
คุณยังสามารถใช้git remote set-branches origin '*'สำหรับสาขาทั้งหมดแทนที่*ด้วยชื่อสาขาสำหรับสาขาหนึ่ง
jthill

ขอบคุณ! วันนี้ช่วยชีวิตฉัน
Steven Xu

สิ่งที่ไม่-vvvอยู่ในค่าเฉลี่ยgit fetch -vvv? ฉันไม่พบข้อมูลใด ๆ เกี่ยวกับเรื่องนี้ใน git-fetch doc
guo

@guo มันเป็นสำหรับverbosityหรือระดับของการเข้าสู่ระบบdebug gitมันไม่ได้มาจากfetchวิธีการ
marlo

1
@ kawing-chiu สิ่งนี้มีประโยชน์หากคุณมีสาขาจำนวนมากและขนาดใหญ่สำหรับ 'การเชื่อมต่ออินเทอร์เน็ต' ก่อนหน้านี้และตอนนี้สามารถซื้อสาขาเหล่านั้นได้ทั้งหมด :)
marlo

65

จากการอ่านคำตอบและความคิดเห็นจาก @jthill สิ่งที่ได้ผลดีที่สุดสำหรับฉันคือการใช้set-branchesตัวเลือกในgit remoteคำสั่ง:

$ git clone --depth 1 https://github.com/dogescript/dogescript.git
$ git remote set-branches origin 'remote_branch_name'
$ git fetch --depth 1 origin remote_branch_name
$ git checkout remote_branch_name

ซึ่งจะเปลี่ยนรายชื่อสาขาที่ติดตามโดยรีโมตที่มีชื่อเพื่อให้เราสามารถดึงข้อมูลและชำระเงินเฉพาะสาขาที่ต้องการได้


18
อาจเป็นการดีกว่าที่จะใช้git remote set-branches --add origin 'remote_branch_name'เพื่อให้สาขาใหม่อยู่นอกเหนือจากสาขาที่มีอยู่แทนที่จะแทนที่ในรายการสาขา (หรือรูปแบบสาขา) ของรีโมตเพื่อดึงข้อมูลในไฟล์. git / config
dumbledad

2
OMG คำพูดเดียว'มีความสำคัญในgit remote set-branches --add origin 'remote_branch_name'
สุดสัปดาห์

@Weekend ฉันไม่สามารถรับทำงานนี้จนกว่าฉันซ้ายราคาเดียวออก
PandaWood

@PandaWood คุณอาจจะใช้ Windows เครื่องหมาย "$" ในคำตอบหมายถึง Bash (บน Unix หรือ Cygwin / MSYS)
Yongwei Wu

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