ฉันจะ "เลิกทำ" - โคลนสาขาเดียวได้อย่างไร


104

ฉันโคลน repo โดยใช้ไฟล์

git clone -b <branch name> --single-branch <github url> <target directory>

โคลนนี้เฉพาะสาขานี้ แต่ตอนนี้ฉันต้องการเปลี่ยนไปใช้สาขาหลักและสาขาอื่น มีวิธีใดบ้างนอกจากการล้างมันออกและเริ่มต้นใหม่เพื่อโคลน repo ที่เหลือที่ฉันสามารถเลิกทำการตั้งค่า - สาขาเดียวได้หรือไม่

คำตอบ:


149

คุณสามารถบอกให้ Git ดึงสาขาทั้งหมดได้ดังนี้:

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

หากคุณมอง.git/configเข้าไปจะมีลักษณะดังนี้:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = false
[remote "origin"]
    url = https://github.com/owner/repo.git
    fetch = +refs/heads/master:refs/remotes/origin/master
[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

ฉันเปรียบเทียบสิ่งนี้กับโคลนเต็มรูปแบบและเห็นว่าความแตกต่างเพียงอย่างเดียวคือ "ดึงข้อมูล" ที่อยู่ใต้ [remote "origin"]ภายใต้

หมายเหตุ: ฉันใช้ Git เวอร์ชัน 1.8.2 ตัวเลือกการกำหนดค่าอาจเปลี่ยนแปลงไปหากคุณใช้ Git เวอร์ชันเก่ากว่า หากคำสั่งของฉันใช้ไม่ได้ฉันขอแนะนำ.git/configให้ลองดูว่าคุณสามารถเห็นสิ่งที่คล้ายกันได้หรือไม่


2
แค่อยากจะขอบคุณเป็นพิเศษเพราะฉันอ่านหนังสือเยอะมากและ googling และไม่สามารถเจออะไรแบบนี้ได้
danieltalsky

2
ดีใจที่ได้ช่วยเหลือ gitเครื่องมือบรรทัดคำสั่งที่มีประสิทธิภาพอย่างไม่น่าเชื่อ (ในความเป็นจริงมากที่สุดของคำสั่งที่จะดำเนินการในแง่ของคำสั่งอื่น ๆ ) ดังนั้นคุณสามารถทำมากทั้งสิ่งที่มีเพียงครั้งเดียวคุณเข้าใจวิธีการเก็บข้อมูลที่มีการออกมาวาง (โดยทั่วไปวิธีการ.gitทำงานของโฟลเดอร์ ).
sarahhodne

สิ่งนี้ไม่ได้ผลสำหรับฉัน - หลังจากรันคำสั่งเหล่านี้git show-ref tagsยังคงล้มเหลว
felixfbecker

1
โปรดทราบว่าโซลูชันนี้จะใช้ได้เช่นกันหากสาขาถูกโคลนตื้นโดยใช้ไวยากรณ์ต่อไปนี้เช่นกันซึ่งพบข้อบกพร่องเดียวกันกับที่ OP อธิบายไว้:git clone --depth=1 --branch branchname git@github.com:foobar/repo.git destinationpath
danemacmillan

1
ว้าวนี่ยังห่างไกลจากสัญชาตญาณ! Git แปลก ๆ ไม่มีคำสั่งให้ทำสิ่งนี้ให้สำเร็จ ใช่ฉันใช้งานได้แล้ว ... และตอนนี้ฉันก็รู้เกี่ยวกับไฟล์ config int he .git ด้วย!
kashiraja

62

หากคุณต้องการเพิ่มสาขาเดียวคุณสามารถดำเนินการดังต่อไปนี้:

git remote set-branches --add origin [remote-branch]
git fetch origin [remote-branch]:[local-branch]

ทำงานร่วมกับ git เวอร์ชัน 1.9.1


1
ฉันรักคุณ
user1760150

4
สิ่งนี้เพิ่มหลายfetch =บรรทัดใน. git / config ซึ่งมีประโยชน์มากเมื่อคุณต้องการสลับไปมาระหว่างสองสาขาบนรีโมท แต่ไม่ดึงสาขาอื่น ๆ ทั้งหมด ขอบคุณ!
Terry Brown

5

หากต้องการเพิ่มสาขาระยะไกลอื่นไปยังที่เก็บในเครื่องของฉันที่โคลนโดยใช้--single-branchสิ่งต่อไปนี้ใช้ได้กับฉัน:

git remote set-branches --add origin [remote-branch]
git fetch
git checkout [remote-branch]

คุณยังสามารถใช้สัญลักษณ์แทนสำหรับ[remote-branch]เช่น

git remote set-branches --add origin release-1.*
git fetch
git checkout release-1.5

นี้ทำงานโดยใช้คอมไพล์รุ่น 2.21.1 คำตอบอื่น ๆ ที่แนะนำให้ทำgit fetch origin [remote-branch]:[local-branch]ไม่ได้ผลเนื่องจากสร้างสาขาท้องถิ่นในสถานะที่ไม่ถูกติดตาม เมื่อรันgit pullครั้งแรกพยายามรวมคอมมิตทั้งหมดของสาขาระยะไกลเข้ากับท้องถิ่นของฉันอีกครั้ง


2
ครั้งที่สองฉันกลับมาที่คำตอบนี้ มีประโยชน์มาก. ขอบคุณ!
Godbout

1
คำตอบที่มีประโยชน์ที่สุด
Denis Itskovich

1

เพียงแค่เพิ่ม repo เดิมเป็นรีโมตใหม่และหลีกเลี่ยงไม่ได้

git remote add path/to/myrepo myNewOrigin
git fetch myNewOrigin

คุณยังสามารถลบรีโมต 'ต้นทาง' ปัจจุบันและเปลี่ยนชื่อ 'myNewOrigin' เป็น 'origin' ได้หากต้องการ

จากนั้นคุณสามารถดึง / ผสาน / สร้างฐานใหม่ได้


0

เพียงแค่เปลี่ยน.git/configไฟล์ของ repo ในพื้นที่ของคุณบรรทัดfetchของ[remote origin] section.

ก่อนจะมีอะไรแบบนี้

[remote "origin"]
    url = https://github.com/owner/repo.git
    fetch = +refs/heads/master:refs/remotes/origin/master

หลังจากนั้นก็จะเป็นเช่นนั้น

[remote "origin"]
    url = https://github.com/owner/repo.git
    fetch = +refs/heads/*:refs/remotes/origin/*

0

ตอนแรกฉันใช้คำตอบของ Dominik Pawlak และได้ผล แต่ฉันไม่สามารถดึงการเปลี่ยนแปลงใด ๆ เพิ่มเติมได้หลังจากที่ฉันใส่รหัสเพิ่มเติมในสาขาใหม่แล้ว

มีอีกวิธีในการรีเซ็ตsingle-branchทั้งหมดซึ่งยังไม่ได้กล่าวถึงที่นี่:

git remote remove origin
git remote add origin git@gitlab.com:{yourProject}/{yourRepo}.git
git branch --set-upstream-to=origin/{yourBranch}  {yourBranch}
git pull

การดำเนินการนี้จะรีเซ็ตทุกอย่างเป็นต้นฉบับ


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