ฉันจะโคลนสาขาเดียวใน Git ได้อย่างไร


799

ฉันมีที่เก็บ Git ในพื้นที่ชื่อ 'Skeleton' ที่ฉันใช้สำหรับเก็บโครงกระดูกของโครงการ มีสาขาไม่กี่แห่งสำหรับโครงการประเภทต่างๆ:

casey@agave [~/Projects/skeleton] git branch
* master
  rails
  c
  c++

ถ้าฉันต้องการตรวจสอบสาขาหลักสำหรับโครงการใหม่ฉันสามารถทำได้

casey@agave [~/Projects] git clone skeleton new
Initialized empty Git repository in /Users/casey/Projects/new/.git/

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

อย่างไรก็ตามสิ่งที่ใช้ไม่ได้คือถ้าฉันต้องการโคลนสาขาอื่น ฉันไม่สามารถรับได้ดังนั้นฉันจึงดึงเฉพาะสาขาที่ฉันต้องการเช่นrailsสาขาจากนั้นที่เก็บใหม่จะมีmasterสาขาที่ผลักดันและดึงจากrailsสาขาที่เก็บโครงกระดูกตามค่าเริ่มต้น

มีวิธีที่ดีในการทำสิ่งนี้หรือไม่? หรือบางทีนี่อาจไม่ใช่วิธีที่ Git ต้องการให้ฉันจัดโครงสร้างสิ่งต่าง ๆ และฉันก็เปิดรับอย่างแน่นอน บางทีฉันควรจะมีที่เก็บหลายแห่งด้วยที่เก็บโครงกระดูก Ruby on Rails ที่ติดตามที่เก็บโครงกระดูกหลัก? และโครงการใด ๆ ก็ตามที่โคลนที่เก็บโครงกระดูก Ruby on Rails


สิ่งที่ไม่git branch -aแสดง?
Jakub Narębski

3
จะgit checkout -b newbranch origin/branchiwantทำงานได้ดีขึ้นหรือไม่ (ไม่มี--trackตัวเลือก)
VonC

3
ฉันคิดว่าสิ่งที่คุณพยายามทำมีความคิดที่ไม่ดี ใช้แหล่งเก็บข้อมูลที่แตกต่างกันสำหรับโครงการต่างๆ กิ่งไม้เป็นสิ่งที่แตกต่างอย่างสิ้นเชิง
innaM

@Manni ฉันคิดแบบนั้นเนื่องจาก git ดูเหมือนจะไม่ชอบสิ่งที่ฉันทำ คุณอธิบายได้ไหม เป็นเพราะสาขาไม่ควรอยู่นาน?
Casey Rodarmor

1
@rodarmor ฉันคิดว่าสิ่งที่คุณพยายามทำมีความคิดที่ดีและฉันมีคำถามนี้
Paul Du Bois

คำตอบ:


863

หมายเหตุ: git1.7.10 (เมษายน 2012)ช่วยให้คุณสามารถโคลนได้เพียงสาขาเดียว :

# clone only the remote primary HEAD (default: origin/master)
git clone --single-branch

as in:
git clone <url> --branch <branch> --single-branch [<folder>]

คุณสามารถดูได้ในt5500-fetch-pack.sh:

test_expect_success 'single branch clone' '
  git clone --single-branch "file://$(pwd)/." singlebranch
'

Tobu แสดงความคิดเห็นว่า:

นี่เป็นนัยเมื่อทำการโคลนแบบตื้น
ทำให้git clone --depth 1วิธีที่ง่ายที่สุดในการประหยัดแบนด์วิดธ์

และตั้งแต่ Git 1.9.0 (กุมภาพันธ์ 2014) โคลนตื้นจึงรองรับการถ่ายโอนข้อมูล (push / pull) ดังนั้นตัวเลือกดังกล่าวจึงมีประโยชน์มากยิ่งขึ้นในขณะนี้
ดูเพิ่มเติมได้ที่ " Is git clone --depth 1(ตื้นโคลน) มีประโยชน์มากกว่าก็จะทำให้ออกมา? "


"การเลิกทำ" โคลนตื้นมีรายละเอียดที่ " แปลงโคลนโคลนเป็นโคลนเต็ม " (git 1.8.3+)

# unshallow the current branch
git fetch --unshallow

# for getting back all the branches (see Peter Cordes' comment)
git config remote.origin.fetch refs/heads/*:refs/remotes/origin/*
git fetch --unshallow

ในฐานะที่เป็นคริสแสดงความคิดเห็น:

สายเวทย์สำหรับการทำให้กิ่งที่หายไปกลับ--single-branchเป็น (git v2.1.4):

git config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
git fetch --unshallow  

ด้วย Git 2.26 (ไตรมาสที่ 1 ปี 2020), " git clone --recurse-submodules --single-branch" ตอนนี้ใช้ตัวเลือกเดียวสาขาเดียวกันเมื่อโคลน submodules

ดูกระทำ 132f600 , กระทำ 4731957 (21 กุมภาพันธ์ 2020) โดยเอมิลี่ Shaffer (nasamuffin )
(ผสานโดยJunio ​​C Hamano - gitster- in b22db26 , 05 Mar 2020)

clone: pass --single-branch ระหว่าง --recurse-submodules

ลงชื่อออกโดย: Emily Shaffer
ตอบรับโดย: Jeff King

ก่อนหน้านี้การแสดง " git clone --recurse-submodules --single-branch" ส่งผลให้ submodules โคลนทุกสาขาแม้ว่า superproject จะโคลนเพียงหนึ่งสาขาเท่านั้น

ไพพ์--single-branchผ่านเฟรมเวิร์กตัวช่วย submodule เพื่อให้เป็น ' clone' ในภายหลัง


80
git clone <url> --branch <branch> --single-branch <folder>ทำงานเหมือนจับใจ
Alexander

1
ใช่ฉันคิดว่าถึงเวลาที่จะปรับปรุงคำตอบที่ได้รับการยอมรับแล้ว :) นี่มัน "ทำงานได้อย่างมีเสน่ห์"
kumarharsh

5
นอกจากนี้นี่เป็นนัยเมื่อทำการโคลนแบบตื้น ทำให้clone --depth 1วิธีที่ง่ายที่สุดในการประหยัดแบนด์วิดธ์
Tobu

1
@Tobu และ VonC --depth 1ไม่ปลอดภัยสำหรับผู้ใช้เพราะพวกเขาอาจต้องการที่จะผลัก / ดึงด้วยโคลนใหม่
nmr

2
เพียงแค่จะสะกดออกแก้ไขปีเตอร์คอร์ดเต็มบรรทัดมายากลสำหรับการรับสาขาที่ขาดหายไปจะกลับ--single-branchเป็นgit config remote.origin.fetch +refs/heads/*:refs/remotes/origin/*และgit fetch --unshallow(คอมไพล์ v2.1.4)
คริส

670

วิธีหนึ่งคือดำเนินการต่อไปนี้

git clone user@git-server:project_name.git -b branch_name /your/folder

branch_nameสาขาที่คุณเลือกอยู่ที่ไหนและ "/ your / folder" เป็นโฟลเดอร์ปลายทางสำหรับสาขานั้น เป็นความจริงที่ว่าสิ่งนี้จะนำมาซึ่งสาขาอื่น ๆ ที่ให้โอกาสคุณรวมตัวกลับไปกลับมา

ปรับปรุง

ตอนนี้เริ่มจาก Git 1.7.10 ตอนนี้คุณสามารถทำได้

git clone user@git-server:project_name.git -b branch_name --single-branch /your/folder

36
ใช้งานได้ แต่ดึงทุกสาขา ดู @ frerich = คำตอบของ raabe ด้านล่าง
cdunn2001

3
ขอบคุณ. เพิ่ม "-b branch_name" ในกรณีของฉันเท่านั้น มันช่วยฉันประหยัดเวลาได้มาก
PhatHV

ใช่มันทำงานได้อย่างสมบูรณ์แบบ ... ! ฉันเป็นคนของ TFS มากขึ้นและสำหรับโครงการส่วนตัวของฉันใช้ git ก่อนหน้านี้จะแตกแขนงออกไปฉันทำผิดไปก่อนหน้านี้และรู้วิธีที่ง่ายและดูดีมาก! ขอบคุณอีกครั้ง! +1 แล้วถ้าเป็นไปได้ฉันจะให้ +100 :)
k25

11
คุณสามารถเพิ่ม--single-branchเพื่อดึงเฉพาะประวัติที่เกี่ยวข้องกับสาขานี้แทนประวัติ & แท็กทั้งหมดที่มีที่เก็บ
flawyte

1
@AlexNolasco คุณช่วยกรุณาแก้ไขคำตอบที่บอกว่า/ some / folderคืออะไร? ขอบคุณ
Nabin

112

ใช้ Git เวอร์ชั่น 1.7.3.1 (บน Windows) นี่คือสิ่งที่ฉันทำ ( $BRANCHเป็นชื่อของสาขาที่ฉันต้องการชำระเงินและ$REMOTE_REPOเป็น URL ของที่เก็บระยะไกลที่ฉันต้องการโคลน):

mkdir $BRANCH
cd $BRANCH
git init
git remote add -t $BRANCH -f origin $REMOTE_REPO
git checkout $BRANCH

ข้อดีของวิธีนี้คือการโทรgit pull(หรือgit fetch) ที่ตามมาจะดาวน์โหลดสาขาที่ร้องขอด้วย


สคริปต์ของคุณกับบรรทัดนี้ต่างกันอย่างไร git clone -b $BRANCH $REMOTE_REPO $BRANCHafik พวกเขาเหมือนกันหรือไม่
เอียนวอห์น

12
@Ian: ความแตกต่างอย่างหนึ่งคือgit clone -bให้การอ้างอิงระยะไกลทั้งหมด (สาขาและแท็กระยะไกลทั้งหมด) เป็นgit branch -aรายการ ด้วยสคริปต์ของฉันคุณจะได้รับการอ้างอิงเดียว
Frerich Raabe

1
เมื่อฉันลองด้านบน (พูดกับ $ BRANCH = "nick") ฉันจะได้รับ 'ถึงตาย: หา refs / heads / nick' จากระยะไกลไม่พบ ดูเหมือนจะไม่ได้ผลสำหรับฉัน ...
Nick

3
โปรดทราบว่าใช้-t $BRANCHงานได้แม้ไม่มี-fซึ่งจะดึงข้อมูลได้ทันที จากนั้นgit fetch originจะดึงข้อมูลและgit checkout $BRANCHสร้างสาขาท้องถิ่นและเช็คเอาต์ git config remote.origin.uploadpack=/bin/upload-packที่จะเป็นประโยชน์เมื่อคุณต้องกำหนดค่าระยะไกลก่อนที่จะเรียกเช่น
cdunn2001

1
ในขณะที่ฉันอยู่ในคอมไพล์องค์กร "เก่า" (1.6.0.2) ฉันผูกพันกับวิธีแก้ปัญหาข้างต้น ฉันมีปัญหาเช่นเดียวกับ @Nick การดำเนินการคอมไพล์แสดงให้เห็นว่าbranch -a origin/$BRANCHการgit checkout origin/$BRANCHแก้ไขนี้
dr jerry

30

คุณสามารถลองวิธียืดยาว:

mkdir newrepo.git
cd newrepo.git
git init
git remote add origin file:///path/to/original
git fetch origin branchiwant:refs/remotes/origin/branchiwant
git checkout -b branchiwant --track origin/branchiwant

สิ่งนี้คือ:

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

หวังว่าจะเป็นอย่างที่คุณเป็น


ข้อโต้แย้งในการเพิ่มรีโมตคอมไพล์ถูกสลับ แต่ฉันไม่สามารถรับเช็คเอาต์ได้ "ข้อผิดพลาดต้นทาง / รางชำระเงินของ git" ให้ฉัน "ข้อผิดพลาด: pathspec 'ต้นทาง / ราง' ไม่ตรงกับไฟล์ใด ๆ ที่ git รู้จัก" และอีกทางเลือกหนึ่งทำให้ฉัน "ร้ายแรง: เช็คเอาต์ git: การอัปเดตพา ธ ไม่สามารถใช้ได้กับการสลับแบรนช์"
Casey Rodarmor

@rodarmor: ได้แก้ไขคำสั่ง git remote แล้วขอบคุณ คุณสามารถวางเอาท์พุตของgit branch -r?
jkp

@jkp จริง ๆ แล้วgit branch -rไม่มีผลลัพธ์
Casey Rodarmor

@rodarmor: ฉันได้แก้ไขตัวอย่างและนี่ใช้งานได้จริง (ทดสอบ) HTH (คุณสามารถยอมรับมันเคยทดสอบคุณชอบ;))
JKP

สวิตช์ -b นั้นค่อนข้างใหม่ ครั้งสุดท้ายที่ฉันวิ่งบนเดเบียนบีบมันไม่สามารถใช้ได้ IIRC
sehe

23

คุณสามารถทำได้โดยใช้คำสั่งด้านล่าง:

git clone -b branch_name --single-branch project_url local_folder_to_clone_in

2
ทำงานได้อย่างสมบูรณ์แบบจริง ๆ แล้วฉันมีปัญหาใน Source Tree ที่จะโคลนสาขาเดียวดังนั้นมันจึงทำเอง
azhar22k

17

จากหน้าคน git-clone :

--single-branchเป็นเพื่อนของคุณในช่วงโคลนอย่าลืมที่จะใช้กับ--branch <branch name>หรือหัวหน้าหลักระยะไกลเท่านั้นที่จะถูกโคลน (ต้นแบบโดยค่าเริ่มต้น)

โปรดจำไว้เสมอว่าให้ทำCtrl+ F5เพื่ออ่านแหล่งที่มาใหม่ไม่ใช่จากแคช :-) (ฉันไม่ทราบเกี่ยวกับตัวเลือกนี้เป็นเวลานาน)


1
git clone <url> --branch <branch> --single-branch <folder>
shridutt kothari


8

โคลนเพียงสาขาเดียว นี่เป็นวิธีที่ง่ายที่สุด:

$ git clone -b BRANCH_NAME --single-branch git@bitbucket.org:___/PROJECTNAME.git

4

สำหรับการโคลนสาขาเฉพาะที่คุณสามารถทำได้:

git clone --branch yourBranchName git@yourRepository.git


3

สำหรับการโคลนสาขา Git คุณไม่มีรหัสสาธารณะให้ใช้สิ่งนี้:

git clone -b <branch> <Git repository URL or clone URL you get from Git repository>

2

เปิด cmd

cd folder_name (ป้อนเส้นทางที่จะโคลนสาขา)

เพียงคำสั่งเดียว:

git clone url_of_projecturltoclone -b branch_name

2

ช้าไปหน่อย แต่ฉันต้องการเพิ่มโซลูชันที่ฉันใช้เพื่อแก้ไขปัญหานี้ ผมพบว่าวิธีการแก้ปัญหาที่นี่

อย่างไรก็ตามคำถามดูเหมือนว่าจะถาม 'วิธีการเริ่มโครงการใหม่จากสาขาของ repo อื่นได้หรือไม่'

ด้วยวิธีนี้โซลูชันที่ฉันใช้คือก่อนสร้าง repo ใหม่ใน github หรือที่เคย สิ่งนี้จะทำหน้าที่เป็น repo สำหรับโครงการใหม่ของคุณ

บนเครื่องโลคัลของคุณนำทางไปยังโปรเจ็กต์ที่มีสาขาที่คุณต้องการใช้เป็นเทมเพลตสำหรับโปรเจ็กต์ใหม่ของคุณ

เรียกใช้คำสั่ง:

git push https://github.com/accountname/new-repo.git +old_branch:master

สิ่งนี้จะทำคือผลักดัน old_branch ไปที่ repo ใหม่และทำให้มันเป็นสาขาหลักของ repo ใหม่

จากนั้นคุณเพียงแค่ต้องลอกแบบ repo ใหม่ลงในไดเรกทอรีท้องถิ่นของโครงการใหม่ของคุณและคุณได้เริ่มโครงการใหม่ที่สาขาเก่า


2

ให้เรานำตัวอย่างของ repo ขวด มันมี 3 สาขานอกเหนือจากต้นแบบ ให้เราตรวจสอบสาขาระยะไกล 1.1.x

โคลน repo คอมไพล์

git clone https://github.com/pallets/flask

cd เข้าไปใน repo

cd flask

ดึงสาขาระยะไกล 1.1.x

git fetch origin 1.1.x

ชำระเงินที่สาขา

git checkout 1.1.x

คุณจะเปลี่ยนเป็นสาขา 1.1.x และจะติดตามสาขา 1.1.x รีโมต


0

คล้ายกับสิ่งที่ @ nosaiba-darwish พูดที่นี่: ที่นี่

นี่คือสิ่งที่เรามักจะทำใน บริษัท ของเรา:

git clone -b <name_of_branch> --single-branch <git_url> folder_to_clone_locally


0

หากคุณต้องการโคลนโคลนคุณสามารถทำได้ด้วย:

git clone -b mybranch --depth=1 https://example.com/myproject.git localname

--depth=1--single-branchหมายถึง


0

มีวิธีแก้ไขปัญหาหลัก 2 ประการสำหรับสิ่งนี้:

  1. คุณต้องระบุชื่อสาขาด้วยสวิตช์คำสั่ง -b นี่คือไวยากรณ์ของคำสั่งเพื่อโคลนสาขา git เฉพาะ

git clone -b <BRANCH_NAME> <GIT_REMOTE_URL>

ตัวอย่าง: git clone -b tahir https://github.com/Repository/Project.git

คำสั่งต่อไปนี้จะโคลนสาขาtahirจากที่เก็บ git คำสั่งดังกล่าวข้างต้นโคลนเฉพาะสาขาที่เฉพาะเจาะจง แต่ดึงรายละเอียดของสาขาอื่น ๆ คุณสามารถดูรายละเอียดสาขาทั้งหมดได้ด้วยคำสั่ง git branch -a

  1. คุณสามารถใช้การตั้งค่าสถานะ'- สาขาเดียว'เพื่อป้องกันการดึงรายละเอียดสาขาอื่นเช่นด้านล่าง:

git clone -b <BRANCH_NAME> --single-branch <GIT_REMOTE_URL>

ตัวอย่าง: git clone -b tahir --single-branch https://github.com/Repository/Project.git

ตอนนี้ถ้าคุณทำ git branch -aมันจะแสดงเฉพาะสาขาปัจจุบันของคุณที่คุณโคลนและไม่ใช่สาขาทั้งหมดดังนั้นมันขึ้นอยู่กับว่าคุณต้องการมันอย่างไร

หวังว่ามันจะช่วยให้ใครซักคนในวันนี้ !! ...


0

คุณสามารถใช้คำสั่งนี้เพื่อคอมไพล์สาขาเดียวและเปลี่ยนชื่อโฟลเดอร์หากคุณต้องการแยกให้เป็นแบบสแตนด์อะโลน

git clone -b [branch-name] --single-branch [url]  [folder_name]

ตัวอย่าง

git clone -b mybranch --single-branch git://github/repository.git  project_mybranch


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