ฉันจะดึงหนึ่งสาขาของที่เก็บ Git ระยะไกลได้อย่างไร


247

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

แก้ไข: ฉันคิดออกเอง แต่ StackOverflow ปฏิเสธที่จะให้ฉันให้คำตอบเป็นคำตอบดังนั้นฉันจะใส่ไว้ที่นี่ในคำถามแทน

คุณใช้ตัวเลือก -t เพื่อเพิ่มระยะไกล git เช่น:

git remote add -t remote-branch remote-name remote-url

คุณสามารถใช้-t branchตัวเลือกหลายตัวเลือก "" เพื่อคว้าหลายสาขา


3
โคลนคอมไพล์เรียกพื้นที่เก็บข้อมูลทั้งหมดรวมถึงสาขาทั้งหมด คุณสามารถทำสำเนาตื้น ๆ ได้ แต่นั่นอนุญาตให้คุณระบุจำนวนการแก้ไขเท่านั้นไม่ใช่สาขาใด
Ikke

แน่ใจว่าคุณสามารถตอบคำถามของคุณเองทำไมคุณไม่?
CharlesB

2
ฉันคิดว่า OP หมายความว่าเขาไม่สามารถตอบได้ StackOverflow ตั้งเวลาขั้นต่ำที่ต้องผ่านก่อนที่คุณจะสามารถตอบคำถามของคุณเอง
Lars Nordin

1
สวัสดี OP ตอนนี้อาจเป็นการดีที่จะเพิ่มคำตอบของคุณตอนนี้ วิธีนี้เราสามารถลงคะแนนในมัน (และเปรียบเทียบกับคำตอบอื่น ๆ )
lulalala

3
คำสั่ง git remote add ของคุณกำลังเพิ่มสาขาระยะไกลซึ่งไม่เกี่ยวข้องกับการดึงสาขา!
Chris Halcrow

คำตอบ:


220
git fetch <remote_name> <branch_name>

ทำงานให้ฉัน


14
เพิ่งรู้ว่าสาขาที่ดึงมานั้นมีให้FETCH_HEADหลังจากดึงแล้ว ขอบคุณ!
Christoph

4
จากนั้นจึงgit checkout FETCH_HEADชำระเงิน
d9k

ง่ายและสะดวก
gsumk

จะรับ <remote_name> ได้อย่างไร
mrgloom

@mrgloom ในกรณีส่วนใหญ่คือremote_name originเช่น:git fetch origin <branch_name>
Saahithyan Vigneswaran

67

วิธีหนึ่งคือสิ่งต่อไปนี้:

git fetch <remotename> <remote branch>:refs/remotes/<remotename>/<local branch>

สิ่งนี้ไม่ได้ตั้งค่าการติดตาม

สำหรับข้อมูลเพิ่มเติมโปรดดูเอกสารของคอมไพล์ดึงข้อมูล

แก้ไข : ตามที่ @ user1338062 บันทึกด้านล่าง : ถ้าคุณยังไม่มีการโคลนโลคัลของที่เก็บที่คุณต้องการเพิ่มสาขาใหม่ แต่คุณต้องการสร้างที่เก็บโลคัลใหม่ดังนั้นจึงgit clone --branch <branch_name> --single-branch <repo_url>เป็นโซลูชันที่สั้นกว่า


1
ขอบคุณสิ่งนี้ที่ op ขอมา หากต้องการติดตามการชำระเงินของสาขา git -t <remote branch> / <branch name> <branch name>
ken

7
ถ้าฉันทำได้git checkout <branchname>ฉันเห็นว่าคอมไพล์ตั้งค่าสาขาการติดตามโดยอัตโนมัติหากสาขาเดียวที่มีชื่อนั้นคือสาขาระยะไกล
bukzor

1
นี่เป็นสิ่งเดียวที่ทำงานให้ฉัน แม้ว่าการกำหนดค่าจะถูกตั้งค่าให้ดึงการอ้างอิงสำหรับสาขาเดียว แต่ก็ยังดึงการอ้างอิงไปยังสาขาทั้งหมดโดยใช้การดึงหรือดึง คำสั่งนี้ดึงเฉพาะสาขาที่ฉันต้องการดังนั้น repo เพียง 500kb ไม่ใช่ 5mb ขอบคุณ
herostwist

1
คำตอบนี้อาจจะล้าสมัย git cloneในขณะนี้สนับสนุน--branchและ--single-branchตัวเลือกที่ผมโพสต์คำตอบกับการสาธิต
user1338062

3
@ user1338062 ยังคงใช้ได้หากคุณต้องการดึงสาขาใหม่เท่านั้น (ไม่ใช่ทุกสาขาที่ใช้ git fetch) หลังจากโคลน
rubyprince

35

ฉันรู้ว่ามีคำตอบมากมายอยู่แล้ว แต่นี่เป็นขั้นตอนที่เหมาะกับฉัน:

  1. git fetch <remote_name> <branch_name>
  2. git branch <branch_name> FETCH_HEAD
  3. git checkout <branch_name>

สิ่งเหล่านี้อยู่บนพื้นฐานของคำตอบโดย @Abdulsattar Mohammed ความคิดเห็นโดย @Christoph สำหรับคำตอบนั้นและคำถามอื่น ๆ


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

31

ในการอัพเดตรีโมตที่มีอยู่เพื่อติดตามสาขาเฉพาะให้ใช้:

git remote set-branches <remote-name> <branch-name>

จากgit help remote:

set-branches
    Changes the list of branches tracked by the named remote. This can be used to track a subset of the available remote branches
    after the initial setup for a remote.

    The named branches will be interpreted as if specified with the -t option on the git remote add command line.

    With --add, instead of replacing the list of currently tracked branches, adds to that list.

1
น่าทึ่งฉันอยู่ในที่--single-branchเก็บและไม่สามารถดาวน์โหลดสาขาเพิ่มเติมได้ในภายหลัง ขอบคุณ!
Yajo

22

วิธีหนึ่งในการทำ:

ใน. git / config fetch สำหรับ repo ระยะไกลควรตั้งค่าเพื่อดึงข้อมูลสาขาใด ๆ :

   [remote "origin"]
            fetch = +refs/heads/*:refs/remotes/origin/*

เพื่อดึงข้อมูลสาขาระยะไกล:

git fetch origin branch-name

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

git checkout -b branch-name origin/branch-name

เพื่อแสดงรายการทุกสาขา

git branch -a

16

คัดลอกมาจากโพสต์ของผู้เขียน:

ใช้-tตัวเลือกเพื่อgit remote addเช่น:

git remote add -t remote-branch remote-name remote-url

คุณสามารถใช้หลาย-t branchตัวเลือกเพื่อคว้าหลายสาขา


10
ลดลงทำไมคุณตอบด้วยคำตอบที่มีอยู่ในหัวข้อเดียวกัน
Bowen

13

หากคุณต้องการเปลี่ยนค่าเริ่มต้นสำหรับ "git pull" และ "git fetch" เพื่อดึงข้อมูลเฉพาะสาขาจากนั้นคุณสามารถแก้ไข. git / config เพื่อให้การกำหนดค่าระยะไกลมีลักษณะดังนี้:

[remote "origin"]
  fetch = +refs/heads/master:refs/remotes/origin/master

สิ่งนี้จะดึงข้อมูลต้นแบบจากแหล่งกำเนิดตามค่าเริ่มต้น ดูข้อมูลเพิ่มเติมได้ที่: https://git-scm.com/book/en/v2/Git-Internals-The-Refspec

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


1
ลิงก์ progit.org/book/ch9-5 ได้ย้ายไปที่git-scm.com/book/en/Git-Internals-The-Refspec
ที่นี่

8

เพื่อความสมบูรณ์นี่คือตัวอย่างคำสั่งสำหรับการชำระเงินใหม่:

git clone --branch gh-pages --single-branch git://github.com/user/repo

ตามที่กล่าวไว้ในคำตอบอื่น ๆ มันตั้งค่าremote.origin.fetchเช่นนี้

[remote "origin"]
        url = git://github.com/user/repo
        fetch = +refs/heads/gh-pages:refs/remotes/origin/gh-pages

5

รุ่น git: 2.74

นี่คือวิธีที่ฉันทำ:

git remote add [REMOTE-NAME] [REMOTE-URL]
git fetch [REMOTE-NAME] -- [BRANCH]

4

git เวอร์ชั่น 2.16.1.windows.4

เพียงแค่ทำการgit fetch remoteRepositoryName branchName (eg: git fetch origin my_local_branch)ก็เพียงพอแล้ว การดึงข้อมูลจะเสร็จสิ้นและสาขาในท้องถิ่นใหม่จะถูกสร้างขึ้นด้วยชื่อเดียวกันและการติดตามจะถูกตั้งค่าเป็นสาขาระยะไกล

จากนั้นดำเนินการเช็คเอาต์ branchName ชื่อ


1
สาขาจะไม่ปรากฏภายใต้git branchจนกว่าคุณจะชำระเงิน
ทั่วไป

3

วิธีแก้ปัญหาของฉัน:

git fetch --depth=1
git checkout <branch_name>

หากคุณไม่มีโคลนในเครื่อง:

git clone --depth 1 -b <branch_name> <repo_url>

3
  1. เลือกสิ่งที่<remote_name>คุณต้องการใช้ ( origin อย่าลังเลที่จะใช้และข้ามขั้นตอนที่ 1)
  2. git remote add <remote_name> <remote_url>
  3. git fetch <remote_name> <branch>
  4. เลือกสิ่งที่<your_local_branch_name>คุณต้องการใช้ <branch>อาจจะเป็นเช่นเดียวกับ
  5. git checkout <remote_name>/<branch> -b <your_local_branch_name>

หวังว่าจะช่วย!


2

คำตอบนั้นขึ้นอยู่กับรายชื่อสาขาที่คุณมีอยู่ในปัจจุบัน คุณสามารถดึงข้อมูลสาขาเฉพาะจากระยะไกลได้git fetch <remote_name> <branch_name> หากสาขานั้นอยู่ในรายการสาขาการติดตามอยู่แล้ว (คุณสามารถตรวจสอบได้git branch -r)

ลองสมมติว่าฉันได้โคลนรีโมทด้วยตัวเลือก - สาขาเดียวก่อนหน้านี้และในกรณีนี้สาขาติดตามเดียวที่ฉันมีคือ "โคลน" ฉันสับสนเล็กน้อยโดยแนะนำให้ปรับแต่ง git config ด้วยตนเองเช่นเดียวกับการพิมพ์git remote add <remote_name> <remote_url>คำสั่ง เมื่อ "git เพิ่มจากระยะไกล" ตั้งค่าระยะไกลใหม่ก็เห็นได้ชัดว่ามันไม่ทำงานกับพื้นที่เก็บข้อมูลระยะไกลที่มีอยู่; การจัดหาตัวเลือก "-t branch" ไม่ได้ช่วยฉัน

ในกรณีที่มีรีโมตอยู่และสาขาที่คุณต้องการดึงข้อมูลมีอยู่ในรีโมตนั้น:

  1. ตรวจสอบgit branch -rว่าคุณเห็นสาขานี้เป็นสาขาการติดตามหรือไม่ หากไม่ (เช่นในกรณีของฉันที่มีการโคลนสาขาเดียว) เพิ่มสาขานี้ในรายการสาขาการติดตามโดย "git remote set-branch" ด้วย - เพิ่มตัวเลือก:

    • git remote set-branches --add <remote_name> <branch_name>
  2. ตอนนี้คุณสามารถดึงสาขาที่เฉพาะเจาะจง (ซ้ำคำตอบอื่น ๆ ที่นี่):

    • git fetch <remote_name> <branch_name>
  3. และสร้างและชำระเงินสาขาท้องถิ่นใหม่ด้วย "checkout --track" ซึ่งจะได้รับ "branch_name" เดียวกันกับสาขาการติดตาม:

    • git checkout --track <remote_name>/<branch_name>

0

วิธีที่ง่ายที่สุดในการทำเช่นนั้น

  git fetch origin <branch> && git checkout <branch>

ตัวอย่าง: ฉันต้องการดึงข้อมูลสาขา uat จากจุดเริ่มต้นและเปลี่ยนเป็นสาขาการทำงานปัจจุบัน

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