วิธีดึงข้อมูลสาขา Git ทั้งหมด


1507

ฉันโคลนที่เก็บ Git ซึ่งมีสาขาประมาณห้าแห่ง อย่างไรก็ตามเมื่อฉันgit branchฉันเห็นเพียงหนึ่งในนั้น:

$ git branch
* master

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

$ git branch
* master
* staging
* etc...

1
นอกจากนี้ยังกล่าวถึงที่stackoverflow.com/questions/67699/…
gliptak

2
คำถามนี้แสดงวิธีการรับสาขาทั้งหมดหลังจากใช้การ--single-branchตั้งค่าเมื่อทำการโคลน: stackoverflow.com/questions/17714159/ … ( git fetch --allจะไม่ทำงานหากคุณระบุสาขาเดียว!)
Matthew Wilcoxson

2
คุณจะไม่เห็นผลลัพธ์นั้นเลยเพราะเครื่องหมายดอกจันแสดงถึงสาขาที่กำลังชำระเงินอยู่ เนื่องจากคุณสามารถเช็คเอาท์ได้เพียงสาขาเดียวในครั้งเดียวคุณสามารถมีดอกจันเพียงอันเดียวทางด้านซ้ายของรายชื่อสาขาของคุณ
Robino

5
ฉันเห็นคำตอบมากมาย แต่ไม่มีใครพูดถึงสิ่งที่ฉันคิดว่าน่าจะเป็นวิธีที่ง่ายที่สุดในการทำสิ่งที่คุณต้องการ: git clone --bare <repo url> .git (สังเกตุว่าคุณต้องเพิ่ม "--bare" และ ".git" ในตอนท้ายเพื่อคัดลอก repo "bare" repo) จากนั้นgit config --bool core.bare false(ตั้งค่าสถานะ "bare" เป็น false) จากนั้นgit reset --hard(ย้าย HEAD ไปยัง HEAD ปัจจุบันบน repo) ตอนนี้ถ้าคุณgit branchควรเห็นทุกสาขาจาก repo ที่คุณโคลน
Gabriel Ferraz

4
@GabrielFerraz ถ้าอย่างนั้นคุณใช้ฟังก์ชั่นแสดงความคิดเห็นใน Stack Overflow ผู้ใช้สามารถโหวตความคิดเห็นของคุณ แต่ไม่สามารถโหวตได้
ท่อ

คำตอบ:


2050

คุณสามารถดึงข้อมูลสาขาทั้งหมดจากรีโมททั้งหมดดังนี้:

git fetch --all

มันเป็นพื้นย้ายอำนาจ

fetchอัปเดตสำเนาของสาขาระยะไกลในพื้นที่เพื่อให้ปลอดภัยสำหรับสาขาในประเทศของคุณแต่ :

  1. fetchจะไม่อัปเดตสาขาท้องถิ่น (ซึ่งติดตามสาขาระยะไกล); หากคุณต้องการอัปเดตสาขาในพื้นที่ของคุณคุณยังต้องดึงทุกสาขา

  2. fetchจะไม่สร้างสาขาท้องถิ่น (ซึ่งติดตามสาขาระยะไกล) คุณต้องทำด้วยตนเอง หากคุณต้องการแสดงรายการสาขาระยะไกลทั้งหมด: git branch -a

วิธีอัปเดตสาขาท้องถิ่นที่ติดตามสาขาระยะไกล:

git pull --all

อย่างไรก็ตามสิ่งนี้อาจยังไม่เพียงพอ มันจะทำงานเฉพาะกับสาขาในพื้นที่ของคุณที่ติดตามสาขาระยะไกล หากต้องการติดตามสาขาระยะไกลทั้งหมดให้ดำเนินการกับผู้เผยแพร่รายนี้ก่อน git pull --all :

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done

TL; DR เวอร์ชัน

git branch -r | grep -v '\->' | while read remote; do git branch --track "${remote#origin/}" "$remote"; done
git fetch --all
git pull --all

(ดูเหมือนว่าการดึงข้อมูลจะดึงสาขาทั้งหมดจากรีโมททั้งหมด แต่ฉันจะดึงข้อมูลก่อนเสมอเพื่อให้แน่ใจ)

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

PS AFAIK git fetch --allและgit remote updateเทียบเท่า



ความคิดเห็นของ Kamil Szot ซึ่งคนพบว่ามีประโยชน์

ฉันต้องใช้:

for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done

เนื่องจากรหัสของคุณสร้างสาขาท้องถิ่นชื่อorigin/branchnameและฉันได้รับ "refname 'origin / branchname' ไม่ชัดเจนเมื่อใดก็ตามที่ฉันอ้างถึง


41
ขอโทษ ฉันไม่สามารถจินตนาการได้ว่านี่คือสิ่งที่ OP ต้องการจริงๆ คำสั่ง 'pull' คือ 'fetch + merge' และส่วนที่ผสานจะซ้อนทับกิ่งไม้ทั้งหมดที่อยู่ด้านบนของกันและกัน - ออกจากระเบียบหนึ่งยักษ์
GoZoner

10
การดึงข้อมูลนั้นจะไม่สร้างสาขาระยะไกลใหม่ที่คุณยังจำเป็นต้องตรวจสอบด้วยgit checkout -b localname remotename/remotebranch
Learath2

125
ฉันต้องใช้ for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done เพราะรหัสของคุณสร้างสาขาท้องถิ่นชื่อ Origin / branchname และฉันได้รับ "refname 'origin / branchname' ไม่ชัดเจนเมื่อใดก็ตามที่ฉันพูดถึงมัน
Kamil Szot

22
ผมไม่ทราบว่าถ้าผมใช้รุ่นที่แตกต่างกันของ GIT git pull --all; for remote in `git branch -r | grep -v \>`; do git branch --track ${remote#origin/} $remote; doneแต่ผมต้องแก้ไขสคริปต์เพื่อ การเปลี่ยนแปลงทำให้ HEAD หมด
kim3er

16
สำหรับผู้ใช้ Windows:for /F %remote in ('git branch -r') do ( git branch --track %remote) && git fetch --all && git pull --all
สูงสุด

718

หากต้องการแสดงรายการสาขาระยะไกล:
git branch -r

คุณสามารถตรวจสอบพวกเขาเป็นสาขาท้องถิ่นด้วย:
git checkout -b LocalName origin/remotebranchname


88
นี่คือสิ่งที่ฉันกำลังมองหาเมื่อฉันพบคำถามข้างต้น ฉันสงสัยว่ามีหลายคนที่กำลังมองหาวิธีดึงสาขาระยะไกลไม่ต้องการรวมสาขาเข้ากับสำเนาทำงานปัจจุบันของพวกเขา แต่พวกเขาต้องการสาขาท้องถิ่นเหมือนกับสาขาระยะไกล
Frug

11
แม้ว่าสาขาจะไม่ปรากฏในเครื่อง แต่ฉันสามารถทำได้git checkout remotebranchnameและใช้งานได้ อะไรคือสิ่งที่แตกต่างจากโซลูชันของคุณ?
François Romain

12
พฤติกรรมเริ่มต้นของมันในขณะนี้ ไม่ใช่กรณีของ git รุ่นเก่ากว่า การใช้git checkout remotebranchnameใช้ในการเพียงแค่สร้างใหม่ที่ไม่เกี่ยวข้องกับสาขาที่มีชื่อremotebranchname
Learath2

12
คำตอบที่ได้รับการยอมรับนั้นมีบางสิ่งที่แตกต่างกันออกไปและฉันก็ไม่เข้าใจด้วยซ้ำว่าทำไมคำตอบที่ได้รับการยอมรับ
Learath2

8
OP ขอทุกสาขา คำตอบนี้ทำเพียงหนึ่งเดียว
Ted Bigham

193

คุณจะต้องสร้างสาขาท้องถิ่นเพื่อติดตามสาขาระยะไกล

สมมติว่าคุณมีชื่อรีโมตเพียงอันเดียวoriginตัวอย่างข้อมูลนี้จะสร้างสาขาในพื้นที่สำหรับรีโมตติดตามทั้งหมด:

for b in `git branch -r | grep -v -- '->'`; do git branch --track ${b##origin/} $b; done

หลังจากนั้นgit fetch --allจะอัปเดตสำเนาของรีโมตสาขาในพื้นที่ทั้งหมด

นอกจากนี้git pull --allจะอัปเดตสาขาการติดตามในพื้นที่ของคุณ แต่ขึ้นอยู่กับการกระทำในพื้นที่ของคุณและวิธีการตั้งค่าตัวเลือก 'รวม' ซึ่งอาจสร้างการคอมมิทส่งต่อหรือข้ามอย่างรวดเร็ว


5
วิธีนี้จะทำให้การแก้ปัญหาแข็งแกร่งขึ้นเมื่อเทียบกับชื่อสาขาที่มีเชลล์เมตาอักขระ (ตามความคิดเห็นของ Pinkeen ในคำตอบอื่น ๆ ) และหลีกเลี่ยงข้อผิดพลาดออกปลอม: git branch -r | grep -v - '->' | ในขณะที่อ่านจากระยะไกล ทำ git branch - ติดตาม "$ {remote # origin /}" "$ remote" 2> & 1 | grep -v 'มีอยู่แล้ว'; เสร็จแล้ว
Daira Hopwood

6
คุณแน่ใจหรือว่าgit pull --allจะอัปเดตสาขาติดตามท้องถิ่นทั้งหมด เท่าที่ฉันสามารถบอกได้เพียงอัปเดตสาขาปัจจุบันจากรีโมททั้งหมด
แอนดี้

3
ทำสิ่งนี้ ไม่ได้สร้างสาขาท้องถิ่นที่ตรงกับสาขาระยะไกล อะไรคือคำสั่ง git ที่พูดง่าย ๆ ว่า "ดึงกิ่งก้านสาขาที่อยู่ห่างไกลทั้งหมดที่สร้างขึ้นมาในท้องถิ่นถ้าไม่มีอยู่"
JosephK

@JosephK บางทีรีโมตของคุณไม่ได้ถูกเรียกorigin? ดูคำตอบนี้ซึ่งจะทำงานกับชื่อระยะไกลทั้งหมด
Tom Hale

@ TomHale มันเป็น "จุดเริ่มต้น" แต่ขอบคุณสำหรับคำตอบของคุณ - แม้ว่าจะบ้ามากที่จำเป็นในการทำสิ่งที่ควรจะเป็นหนึ่งหรือสองธง ตอนนี้ฉันพยายามไร้สาระเพื่อพยายามหลีกเลี่ยงความบ้าของบางแง่มุมของคอมไพล์
JosephK

116

ถ้าคุณทำ:

git fetch origin

จากนั้นพวกเขาจะอยู่ที่นั่นในพื้นที่ ถ้าคุณทำแล้ว:

git branch -a

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

git diff origin/branch-name 

หรือ

git merge origin/branch-name

หรือ

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

5
เพิ่งพบหน้านี้ใน google ... นี่เป็นคำตอบที่ฉันต้องการ ฉันลองใช้คำสั่งแรก แต่ได้รับข้อผิดพลาด: [$ git fetch - all origin fatal: fetch - all ไม่ได้ใช้อาร์กิวเมนต์ที่เก็บ] - การใช้ "git fetch --all" ดูเหมือนจะใช้กลอุบาย ขอบคุณสำหรับผู้นำ!
longda

1
แก้ไขแล้ว (ตัดออก--all)
GoZoner

12
git fetch -allดึงทุกรีโมทรีโมตทั้งหมด git fetch originดึงกิ่งก้านของรีโมทoriginทั้งหมด ต่อมาคือสิ่งที่ OP ขอ
GoZoner

3
--allหมายถึง "รีโมททั้งหมด" ไม่ใช่ "ทุกสาขาของรีโมตที่กำหนด" หลังถูกบอกเป็นนัยจากการดึงข้อมูลใด ๆ จากระยะไกล
spacediver

2
นี่ไม่ใช่วิธีดึงกิ่งไม้ทั้งหมดไปยัง repo ท้องถิ่นจาก repo ระยะไกล
Vladimir Despotovic

69
$ git remote update
$ git pull --all

นี่ถือว่ามีการติดตามทุกสาขา

หากพวกเขาไม่ใช่คุณสามารถยิงมันใน Bash:

for remote in `git branch -r `; do git branch --track $remote; done

จากนั้นรันคำสั่ง


3
เมื่อฉันลองฉันก็ยังได้ผลลัพธ์เหมือนเดิม
David542

4
เหมือนกับ @JacobLowe ฉันพบข้อผิดพลาด แต่ทำงานได้อยู่ดี 'ร้ายแรง: สาขาที่ชื่อ' ต้นกำเนิด / หลัก 'มีอยู่แล้ว'
AnneTheAgile

นี่น่าเกลียดเพราะจะพยายามสร้างสาขา->ที่น่าจะมีอยู่ในผลลัพธ์ของgit branch -r`แหล่งกำเนิด / หัว -> แหล่งกำเนิด / ต้นแบบ '
Tom Hale

ยิ่งกว่านั้นมันใช้งานไม่ได้ ฉันได้รับผลลัพธ์: Branch 'origin/quote-filenames' set up to track local branch 'master'. ผลลัพธ์ที่ต้องการคือ: Branch 'quote-filenames' set up to track remote branch 'quote-filenames' from 'origin'. นี่คือถอยหลังการตั้งค่าจุดกำเนิดเพื่อติดตามระยะไกล ดูคำตอบนี้สำหรับการแก้ไข
Tom Hale

สิ่งที่ฉันต้องการ ตั้งแต่ฉันเปลี่ยนเครื่องแมคถึงแม้ว่าฉันจะลอกแบบ repo ฉันก็ไม่สามารถชำระเงินที่สาขาระยะไกลอื่น ๆ และgit fetchไม่ทำงาน ดังนั้นบทเรียนที่นี่คือคุณต้องติดตามสาขาที่อยู่ห่างไกล Gracias!
Victor Ramos

58

Bash forloop ไม่ได้ผลสำหรับฉัน แต่มันก็ทำในสิ่งที่ฉันต้องการ กิ่งก้านทั้งหมดจากต้นกำเนิดของฉันสะท้อนเป็นชื่อเดียวกันในพื้นที่

git checkout --detach
git fetch origin '+refs/heads/*:refs/heads/*'

ดูความคิดเห็นของMike DuPontด้านล่าง ฉันคิดว่าฉันกำลังพยายามทำสิ่งนี้บนเซิร์ฟเวอร์เจนกินส์ซึ่งปล่อยไว้ในโหมดหัวเดี่ยว


6
ที่สร้างขึ้นfatal: Refusing to fetch into current branch refs/heads/master of non-bare repositoryหลังจากการโคลนอย่างง่าย ต้องถอดหัวก่อน ฉันทำสิ่งนี้กับgit checkout <SHA>
brannerchinese

6
โซลูชันของฉันใช้สิ่งนี้git checkout --detach # detach the headแล้วgit fetch origin \'+refs/heads/*:refs/heads/*
Mike DuPont

1
อันนี้ใช้ได้สำหรับฉันยกเว้นฉันยังใช้พารามิเตอร์ --tags ฉันหวังว่าจะมีมาตรฐานปลายด้านหน้าที่เรียบง่ายสำหรับคอมไพล์จำนวนของสิ่งที่เรียบง่ายในคอมไพล์ที่ต้องการคำตอบแบบสแต็กเกิน 10 บวกนั้นไร้สาระ!
kristianp

1
@kristianp คุณได้ดู Ungit หรือ GitKraken หรือยัง?
dragon788

@ dragon788 ฉันใช้ SourceTree สำหรับ git GUI แต่ฉันกำลังพูดถึงบรรทัดคำสั่งที่ง่ายกว่าสำหรับงานเขียนสคริปต์
kristianp

51

ใช้ git fetch && git checkout RemoteBranchNameใช้

มันใช้งานได้ดีมากสำหรับฉัน ...


6
นี่คือคำตอบที่ดีที่สุดใหม่ทั้งหมด ฉันไม่รู้ว่านี่อาจเป็นไปไม่ได้มาก่อน แต่อย่างน้อยรุ่นล่าสุดของ Git จะสังเกตเห็นว่าคุณกำลังพยายามชำระเงินที่สาขาระยะไกลและจะตั้งสาขาการติดตามในท้องถิ่นให้คุณโดยอัตโนมัติ (และคุณไม่ต้องการ เพื่อระบุorigin/branchมันพอจะพูดได้เท่านั้นbranch)
Neil Traft

9
นี่ไม่ได้ตอบคำถามเดิม: "ฉันจะดึงกิ่งไม้ทั้งหมดในพื้นที่ได้อย่างไร" มันดึงพวกเขาทีละคนซึ่งไม่สามารถปรับขนาดได้
ingyhere

นี่เป็นคำตอบเดียวที่ทำให้ฉันสามารถดึงกิ่งไม้ที่อยู่ห่างไกลในทุกสถานการณ์ที่ฉันเจอ
Emmanuel Buckshi

38

เมื่อคุณโคลนที่เก็บข้อมูลทั้งหมดของสาขาจะถูกดาวน์โหลดจริง แต่สาขาจะถูกซ่อน ด้วยคำสั่ง

$ git branch -a

คุณสามารถแสดงสาขาทั้งหมดของที่เก็บและด้วยคำสั่ง

$ git checkout -b branchname origin/branchname

จากนั้นคุณสามารถ "ดาวน์โหลด" ด้วยตนเองทีละรายการ


อย่างไรก็ตามมีวิธีที่สะอาดกว่าและเร็วกว่าแม้ว่ามันจะค่อนข้างซับซ้อน คุณต้องการสามขั้นตอนในการทำสิ่งนี้:

  1. ขั้นแรก

    สร้างโฟลเดอร์ว่างใหม่บนเครื่องของคุณและคัดลอกสำเนาของโฟลเดอร์. git จากที่เก็บ:

    $ cd ~/Desktop && mkdir my_repo_folder && cd my_repo_folder
    $ git clone --mirror https://github.com/planetoftheweb/responsivebootstrap.git .git
    

    ที่เก็บโลคัลภายในโฟลเดอร์ my_repo_folder ยังคงว่างเปล่ามีเพียงโฟลเดอร์. git ที่ซ่อนอยู่ซึ่งคุณสามารถดูได้ด้วยคำสั่ง "ls -alt" จากเทอร์มินัล

  2. ขั้นตอนที่สอง

    เปลี่ยนที่เก็บนี้จากที่เก็บที่ว่างเปล่า (เปลือย) เป็นที่เก็บปกติโดยเปลี่ยนค่าบูลีน "bare" ของการกำหนดค่า git เป็น false:

    $ git config --bool core.bare false
    
  3. ขั้นตอนที่สาม

    หยิบทุกอย่างที่อยู่ในโฟลเดอร์ปัจจุบันและสร้างกิ่งก้านทั้งหมดในเครื่องท้องถิ่นดังนั้นจึงเป็น repo ปกติ

    $ git reset --hard
    

ดังนั้นตอนนี้คุณสามารถพิมพ์คำสั่ง git branchและคุณจะเห็นว่าสาขาทั้งหมดถูกดาวน์โหลด

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


1
โหวตขึ้นเพื่อพูดถึงสาขาที่ซ่อนอยู่ ช่วยฉันเข้าใจการติดตามสาขาในท้องถิ่นอย่างมาก
mburke05

มันเป็นคำตอบที่ดี แต่คำถามแสดงถึงบางสิ่งบางอย่างสำหรับการใช้งานทุกวัน มันไม่จริงที่จะโคลนที่เก็บทุกครั้ง
Z. Khullah

เหตุใดการรีเซ็ตจึงสร้างสาขาทั้งหมดในเครื่อง
Z. Khullah

@ Z.Kullullah ไม่ใช่การรีเซ็ตที่สร้างกิ่งก้านทั้งหมด แต่เป็นโคลน - มิร์เรอร์ โชคไม่ดีสำหรับเราที่สร้าง repo เปลือยซึ่งเป็นขั้นตอนที่ 2 และ 3 ที่เปลี่ยนแปลง
ScottJ

29

คุณสามารถดึงข้อมูลสาขาทั้งหมดโดย:

git fetch --all

หรือ:

git fetch origin --depth=10000 $(git ls-remote -h -t origin)

--depth=10000พารามิเตอร์อาจช่วยถ้าคุณได้ shallowed พื้นที่เก็บข้อมูล


ในการดึงกิ่งก้านทั้งหมดให้ใช้:

git pull --all

หากด้านบนไม่ทำงานให้นำหน้าคำสั่งด้านบนด้วย:

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

ในขณะที่remote.origin.fetchได้รับการสนับสนุนเพียงเฉพาะสาขาขณะดึงโดยเฉพาะอย่างยิ่งเมื่อคุณโคลน repo --single-branchของคุณด้วย ตรวจสอบโดย:git config remote.origin.fetchตรวจสอบเรื่องนี้โดย:

หลังจากนั้นคุณจะสามารถชำระเงินที่สาขาได้

ดูสิ่งนี้ด้วย:


ในการดันกิ่งไม้ทั้งหมดไปยังรีโมทให้ใช้:

git push --all

ในที่สุด --mirrorเพื่อสะท้อนผู้อ้างอิงทั้งหมด


หากเป้าหมายของคุณคือการทำซ้ำพื้นที่เก็บข้อมูลดู: ทำซ้ำบทความที่เก็บข้อมูลที่ GitHub


1
เยี่ยมมาก ... ฉันลองทุกอย่างก่อนที่จะแก้ปัญหาของคุณในหน้านี้ ขอบคุณมาก!
Sujoy

2
ฉันใช้การโคลนแบบตื้น ( depth=1) และการกำหนดค่ายังระบุหนึ่งสาขาเฉพาะสำหรับfetch- depth=1000พารามิเตอร์คือการแก้ไขที่ช่วยให้ฉันเช็คเอาต์สาขาระยะไกลที่เฉพาะเจาะจง
Sandra

2
pull --allไม่ดึงกิ่งก้านสาขาทั้งหมด แต่รีโมตทั้งหมด
Z. Khullah

เคล็ดลับดีกับการกำหนดค่า แต่! จะเรียกพวกเขาทั้งหมดตลอดเวลา
Z. Khullah

ฉันตรวจสอบการกำหนดค่าตามที่คุณเขียน แต่ก็ใช้ได้กับสาขาปัจจุบันเท่านั้น ดูเหมือนว่าคำตอบทั้งหมดที่นี่ไม่ได้ผลสำหรับฉัน ...
Alexei Martianov

25

ฉันมักจะใช้สิ่งอื่นนอกจากคำสั่งเช่นนี้:

git fetch origin
git checkout --track origin/remote-branch

รุ่นที่สั้นกว่าเล็กน้อย:

git fetch origin
git checkout -t origin/remote-branch

17

ฉันเชื่อว่าคุณได้โคลนที่เก็บโดย:

git clone https://github.com/pathOfrepository

ตอนนี้ไปที่โฟลเดอร์นั้นโดยใช้ cd:

cd pathOfrepository

หากคุณพิมพ์git statusคุณสามารถดูทั้งหมด:

   On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean

วิธีดูประเภทสาขาที่ซ่อนอยู่ทั้งหมด:

 git branch -a

มันจะแสดงรายการสาขาระยะไกลทั้งหมด

ตอนนี้ถ้าคุณต้องการชำระเงินในสาขาเฉพาะใด ๆ เพียงพิมพ์:

git checkout -b localBranchName origin/RemteBranchName

16

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

git clone <ORIGINAL_ORIGIN>
git branch -r | awk -F'origin/' '!/HEAD|master/{print $2 " " $1"origin/"$2}' | xargs -L 1 git branch -f --track 
git fetch --all --prune --tags
git pull --all

git remote set-url origin <NEW_ORIGIN>
git pull
<resolve_any_merge_conflicts>
git push --all
git push --tags
<check_NEW_ORIGIN_to_ensure_it_matches_ORIGINAL_ORIGIN>

3
มีประโยชน์มาก สิ่งที่ฉันต้องการ สิ่งเดียวที่ฉันต้องเปลี่ยนคือในบรรทัดที่สองเพิ่มคำพูดเดี่ยว ๆ รอบ ๆ 'HEAD' และ 'master'; อาจเป็นเพราะฉันใช้ zsh ขอบคุณ!
sockmonk

โดยทั่วไปแล้วจะทำสิ่งต่อไปนี้: (1) รับชื่อจริงของสาขาระยะไกล [ไม่ใช่หัวไม่ใช่ต้นแบบ]; (2) บอก Git ให้ติดตามพวกเขาอย่างสมบูรณ์ [ไม่ใช่วิธีแก้ปัญหาทั้งหมดที่ทำได้]; (3) การดึงและดึงทุกอย่างจากกิ่งเหล่านี้ [รวมถึงแท็ก]; (4) การตั้งค่าแหล่งกำเนิดใหม่และเดินผ่านการผลักดันทุกอย่างขึ้น อีกครั้งโซลูชันอื่น ๆ ส่วนใหญ่ไม่สามารถย้ายชิ้นส่วนทั้งหมดได้ มันทำได้ทั้งหมด
ingyhere

1
ฉันลบ antipattern ของการรัน grep จากนั้น awk และรวมคำสั่ง grep ลงในคำสั่ง awk ขอบคุณtripleee !
ingyhere

อ่านและไม่เขียนgit fetch git pull stackoverflow.com/a/292359/1114926
Green

Git pullทำสิ่งfetchแรกอย่างแน่นอนแต่ง่ายกว่าที่จะบอกได้ว่าปัญหานั้นมาจากfetchส่วนใดส่วนหนึ่งpullหรือmergeส่วนต่อไปของpullเวลาที่fetchถูกดำเนินการอย่างอิสระ
ingyhere

12

หลังจากคุณโคลนที่เก็บข้อมูลหลักแล้วคุณก็สามารถดำเนินการได้

git fetch && git checkout <branchname>

1
ง่าย และทำงานเพื่อรับสาขาจากแหล่งกำเนิดทางไกล
sirvon

3
นี่ไม่ได้ตอบคำถามเดิม: "ฉันจะดึงกิ่งไม้ทั้งหมดในพื้นที่ได้อย่างไร" มันดึงพวกเขาทีละคนซึ่งไม่สามารถปรับขนาดได้ พิจารณากรณีของ 100 สาขา
ingyhere

10

ตรวจสอบให้แน่ใจว่าสามารถดึงข้อมูลรีโมตสาขาทั้งหมดได้ .git/configไฟล์ได้

ในตัวอย่างนี้มีเพียงorigin/productionสาขาเท่านั้นที่สามารถดึงข้อมูลได้แม้ว่าคุณจะพยายามทำgit fetch --allอะไรก็ตามจะเกิดขึ้น แต่ดึงproductionสาขา:

[origin]
fetch = +refs/heads/production:refs/remotes/origin/production

บรรทัดนี้ควรถูกแทนที่ด้วย:

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

จากนั้นเรียกใช้git fetchฯลฯ ...


3
ในการตรวจสอบ: git config --get remote.origin.fetchจากนั้นเป็น (โดยการทำลาย) ตั้งค่า:git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
qneill

หรือแก้ไขไฟล์ข้อความ config ในไดเรกทอรี. git ใช้งานได้สำหรับฉัน
FDIM

9

ดูเหมือนว่าการวนรอบไม่ได้ผลสำหรับฉันและฉันต้องการเพิกเฉยต่อแหล่งกำเนิด / อาจารย์ นี่คือสิ่งที่ทำงานให้ฉัน

git branch -r | grep -v HEAD | awk -F'/' '{print $2 " " $1"/"$2}' | xargs -L 1 git branch -f --track

หลังจากนั้น:

git fetch --all
git pull --all

1
การแปรผันของคำตอบนี้เป็นคำตอบที่ถูกต้อง แต่คำตอบนี้ไม่สามารถใช้ได้ในทุกกรณีของขอบ นอกจากนี้ชื่อสาขาสามารถขี้ขลาด ดังนั้นฉันจึงทำสิ่งต่อไปนี้: git branch -r | grep -v HEAD | grep –v master | awk -F'origin / '' {พิมพ์ $ 2 "" $ 1 "ต้นทาง /" $ 2} '| xargs -L 1 git branch -f --track; เรียก git - ทั้งหมด; git pull - ทั้งหมด; และนั่นคือเคล็ดลับ!
ingyhere

3
การปรับปรุงแบบโวหารเพื่อหลีกเลี่ยงgrep | awk ปฏิปักษ์ : git branch -r | awk -F 'origin/' '!/HEAD|master/{...
tripleee

7

เพียงสามคำสั่งเหล่านี้จะได้รับสาขาทั้งหมด:

git clone --mirror repo.git  .git     (gets just .git  - bare repository)

git config --bool core.bare false

git reset --hard

นี่เป็นต้นเหตุของปัญหาของ OP pull --allถ้าโคลนขวาเขาจะไม่ต้องทำ แต่ถ้ายังมีความจำเป็นคำตอบอื่น ๆ ที่ร้องโดย @Johnno Nola สมมติว่าทุกสาขามีการติดตามผสมกับคำตอบนี้เป็นวิธีที่จะไป
ดร. เบคโก

7

ทำไมไม่มีใครตอบคำถามพวกนี้และอธิบายสิ่งที่เกิดขึ้น?

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

ติดตามสาขาระยะไกลทั้งหมด:

ติดตามสาขาทั้งหมดที่มีอยู่ใน repo ระยะไกล

ทำเอง:

คุณจะเข้ามาแทนที่ด้วยสาขาที่ปรากฏจากการส่งออกของที่<branch>git branch -r

git branch -r
git branch --track <branch>

ทำมันด้วยสคริปต์ทุบตี

for i in $(git branch -r | grep -vE "HEAD|master"); do git branch --track ${i#*/} $i; done

อัปเดตข้อมูลเกี่ยวกับสาขาระยะไกลบนเครื่องคอมพิวเตอร์ของคุณ:

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

git fetch --all

อัปเดตข้อมูลเกี่ยวกับสาขาระยะไกลบนเครื่องคอมพิวเตอร์ของคุณและอัพเดทสาขาท้องถิ่น:

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

git pull --all

4

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

คุณสามารถค้นหารุ่นล่าสุดได้ที่นี่ :

#!/bin/bash

# Clones as usual but creates local tracking branches for all remote branches.
# To use, copy this file into the same directory your git binaries are (git, git-flow, git-subtree, etc)

clone_output=$((git clone "$@" ) 2>&1)
retval=$?
echo $clone_output
if [[ $retval != 0 ]] ; then
    exit 1
fi
pushd $(echo $clone_output | head -1 | sed 's/Cloning into .\(.*\).\.\.\./\1/') > /dev/null 2>&1
this_branch=$(git branch | sed 's/^..//')
for i in $(git branch -r | grep -v HEAD); do
  branch=$(echo $i | perl -pe 's/^.*?\///')
  # this doesn't have to be done for each branch, but that's how I did it.
  remote=$(echo $i | sed 's/\/.*//')
  if [[ "$this_branch" != "$branch" ]]; then
      git branch -t $branch $remote/$branch
  fi
done
popd > /dev/null 2>&1

หากต้องการใช้งานเพียงคัดลอกไปยังไดเรกทอรี git bin ของคุณ (สำหรับฉันแล้วC:\Program Files (x86)\Git\bin\git-cloneall) จากนั้นบนบรรทัดคำสั่ง:

git cloneall [standard-clone-options] <url>

มันโคลนตามปกติ แต่สร้างสาขาการติดตามในท้องถิ่นสำหรับสาขาระยะไกลทั้งหมด


4

วิธีดึงข้อมูลสาขา Git ทั้งหมดติดตาม Single Remote

สิ่งนี้ได้รับการทดสอบและใช้งานกับ Red Hat และ Git Bash ใน Windows 10


TLDR:

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

คำอธิบาย:

ไลเนอร์ตัวเดียวทำการเช็คเอาท์และดึงทุกสาขายกเว้น HEAD

รายการสาขาติดตามระยะไกล

git branch -r

ไม่ต้องสนใจ HEAD

grep -v ' -> '

ถอดชื่อสาขาออกจากระยะไกล

cut -d"/" -f2

ชำระเงินทุกสาขาติดตามระยะไกลเดียว

git checkout $branch

เรียกสาขาที่เช็คเอาท์

git fetch

ในทางเทคนิคแล้วการดึงข้อมูลไม่จำเป็นสำหรับสาขาท้องถิ่นใหม่

สิ่งนี้อาจถูกใช้อย่างใดอย่างหนึ่งfetchหรือpullสาขาที่ทั้งใหม่และมีการเปลี่ยนแปลงในระยะไกล

ตรวจสอบให้แน่ใจว่าคุณดึงถ้าคุณพร้อมที่จะผสาน


ทดสอบการตั้งค่า

ตรวจสอบพื้นที่เก็บข้อมูลด้วย URL SSH

git clone git@repository.git

ก่อน

ตรวจสอบสาขาในท้องถิ่น

$ git branch
* master

ดำเนินการคำสั่ง

ดำเนินการซับหนึ่ง

for branch in `git branch -r|grep -v ' -> '|cut -d"/" -f2`; do git checkout $branch; git fetch; done;

หลังจาก

ตรวจสอบสาขาในพื้นที่ ได้แก่ สาขาระยะไกล

$ git branch
  cicd
  master
* preprod

4

สำหรับผู้ใช้ Windows ที่ใช้ PowerShell:

git branch -r | ForEach-Object {
    # Skip default branch, this script assumes
    # you already checked-out that branch when cloned the repo
    if (-not ($_ -match " -> ")) {
        $localBranch = ($_ -replace "^.*?/", "")
        $remoteBranch = $_.Trim()
        git branch --track "$localBranch" "$remoteBranch"
    }
}
git fetch --all
git pull --all

สิ่งนี้ใช้ได้กับสาขาที่มี / ในชื่อ: git branch -r | ForEach-Object { # Skip default branch, this script assumes # you already checked-out that branch when cloned the repo if (-not ($_ -match " -> ")) { $localBranch = ($_ -replace "^.*?/", "") $remoteBranch = $_.Trim() git branch --track "$localBranch" "$remoteBranch" } }
Markus

3

นี่คือสิ่งที่ฉันคิดว่าแข็งแกร่ง:

  • ไม่อัปเดตการติดตามระยะไกลสำหรับสาขาที่มีอยู่
  • อย่าพยายามอัปเดต HEADเพื่อติดตามorigin/HEAD
  • อนุญาตให้รีโมตชื่ออื่นที่ไม่ใช่ origin
  • อ้างเปลือกอย่างถูกต้อง
for b in $(git branch -r --format='%(refname:short)'); do
  [[ "${b#*/}" = HEAD ]] && continue
  git show-ref -q --heads "${b#*/}" || git branch --track "${b#*/}" "$b";
done
git pull --all

มันไม่จำเป็นต้องgit fetch --allเป็นผ่าน-allไปผ่านตัวเลือกนี้เพื่อภายในgit pullfetch

ให้เครดิตกับคำตอบนี้


2

ต่อไปนี้เป็นรุ่น Perl หนึ่งซับที่ให้ไว้ในคำตอบที่ยอมรับ:

git branch -r | perl -e 'while(<>) {chop; my $remote = $_; my ($local) = ($remote =~ /origin\/(.*)/); print "git branch --track $local $remote\n";}' > some-output-file

คุณสามารถเรียกใช้ไฟล์เอาต์พุตเป็นสคริปต์เชลล์ได้หากต้องการ

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

git remote set-url origin <remote-url>

และในที่สุดก็ผลักสาขาทั้งหมดให้เป็นต้นกำเนิด:

git push --all origin

และเรากลับมาทำธุรกิจอีกครั้ง


1

เราสามารถใส่ชื่อสาขาหรือแท็กทั้งหมดในไฟล์ชั่วคราวจากนั้นดึง git สำหรับแต่ละชื่อ / แท็ก:

git branch -r | grep origin | grep -v HEAD| awk -F/ '{print $NF}' > /tmp/all.txt
git tag -l >> /tmp/all.txt
for tag_or_branch in `cat /tmp/all.txt`; do git checkout $tag_or_branch; git pull origin $tag_or_branch; done


1

ในการหลีกเลี่ยงข้อความแสดงข้อผิดพลาด 'ร้ายแรง: สาขาชื่อ' แหล่งกำเนิด / ต้นแบบ 'มีอยู่แล้ว' คุณต้องการสิ่งนี้:

git branch -r | grep -v '\->'  | grep -v `git branch | awk '/\*/ { print $2; }'`| while read remote; do git branch --track "${remote#origin/}" "$remote"; done

0

ขึ้นอยู่กับคำตอบโดย Learath2 ที่นี่คือสิ่งที่ผมหลังจากทำgit clone [...]และcdไอเอ็นจีลงในไดเรกทอรีสร้าง:

git branch -r | grep -v master | awk {print\$1} | sed 's/^origin\/\(.*\)$/\1 &/' | xargs -n2 git checkout -b

ใช้งานได้สำหรับฉัน แต่ฉันไม่สามารถรู้ว่ามันจะทำงานให้คุณ ระวัง.


0
git remote add origin https://yourBitbucketLink

git fetch origin

git checkout -b yourNewLocalBranchName origin/requiredRemoteBranch (use tab :D)

ตอนนี้ในประเทศของคุณเป็นของคุณyourNewLocalBranchNamerequiredRemoteBranch


0

สำหรับผู้ใช้ Visual Studio บนคอนโซลตัวจัดการแพ็คเกจ:

สาขา git % {git ดึงข้อมูลต้นน้ำ; git รวม upstream / master}


0

ได้ลองหลายวิธีมีเพียงอันเดียวที่เรียบง่ายและเหมาะกับฉัน

for branch in $(git ls-remote -h git@<your_repository>.git | awk '{print $2}' | sed 's:refs/heads/::')
do
  git checkout "$branch"
  git pull
done

0

ตั้งชื่อแทน: (ขึ้นอยู่กับคำตอบด้านบน)

git config --global alias.track-all-branches '!git fetch --all && for remote in `git branch -r`; do git branch --track ${remote#origin/} $remote; done && git fetch --all'

ตอนนี้เพื่อติดตามสาขาทั้งหมด:

git track-all-branches

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