จะทำการโคลนนิ่งรีโมตทั้งหมดใน Git ได้อย่างไร?


4129

ฉันมีmasterและdevelopmentสาขาทั้งผลักดันให้GitHub ฉันcloned, pulled และfetched แต่ฉันยังคงไม่สามารถรับสิ่งอื่นนอกเหนือจากmasterสาขากลับ

ฉันแน่ใจว่าฉันพลาดอะไรบางอย่างที่ชัดเจน แต่ฉันได้อ่านคู่มือแล้วและฉันก็ไม่รู้สึกดีใจเลย


133
คำตอบที่ยอมรับได้ที่นี่ ( git branch -a) แสดงให้คุณเห็นถึงสาขาในรีโมท แต่ถ้าคุณพยายามตรวจสอบสิ่งเหล่านั้นคุณจะอยู่ในสถานะ 'HEAD HEAD' คำตอบถัดไป (upvotes มากที่สุดอันดับที่สอง) ตอบคำถามที่แตกต่างกัน (เพื่อปัญญา: วิธีดึงกิ่งไม้ทั้งหมดและอีกครั้งสิ่งนี้ใช้ได้สำหรับผู้ที่คุณติดตามในพื้นที่เท่านั้น) ความคิดเห็นหลายข้อชี้ให้เห็นว่าคุณสามารถแยกgit branch -aผลลัพธ์ด้วยเชลล์สคริปต์ที่จะติดตามสาขาระยะไกลทั้งหมด สรุป: ไม่มีวิธีการดั้งเดิมในการทำสิ่งที่คุณต้องการและอาจไม่ใช่ความคิดที่ยอดเยี่ยม
วันเดวิสวอเตอร์เบอรี่

5
อาจจะเพียงแค่คัดลอกทั้งโฟลเดอร์ในแบบที่ล้าสมัย? scp some_user@example.com:/home/some_user/project_folder ~ถ้าไม่แน่ใจว่าวิธีการแก้ปัญหาที่ทำงานสำหรับ GitHub แม้ว่า ..
snapfractalpop

19
แทนที่จะพูดว่า "ฉันโคลนดึงและดึงข้อมูล" ดีกว่ามากที่จะแสดงคำสั่งที่คุณใช้จริง
Bob Gilmore

57
มันทำให้ฉันรำคาญอยู่เสมอว่าทำไม "โคลน" ไม่ได้อยู่ในรูปของสำเนาที่ถูกต้อง หากเป็นโคลนที่แน่นอนสาขาทั้งหมดควรเป็นส่วนหนึ่งของที่เก็บในเครื่องหรือไม่ ฉันหมายถึงว่านั่นเป็นจุดแจกจ่าย ดังนั้นเมื่อพื้นที่เก็บข้อมูลบางอย่างหายไปคุณยังคงมีสำเนาทุกอย่างสมบูรณ์ หรือมันเรียกว่า "remote" จริงๆแล้วเป็นส่วนหนึ่งของที่เก็บในเครื่องอยู่แล้ว?
huggie

21
การเห็น upvotes, คำตอบ, ความคิดเห็นเกี่ยวกับคำตอบและจำนวนมุมมองที่น่าเหลือเชื่อฉันคิดว่ามันเป็นเวลาที่ git เพิ่มคำสั่งสำหรับการทำเช่นนี้ และคุณก็คือ @huggie ความคิดของฉัน
Sнаđошƒаӽ

คำตอบ:


4557

ขั้นแรกคัดลอกที่เก็บGitระยะไกลและcdไปที่:

$ git clone git://example.com/myproject
$ cd myproject

ถัดไปดูสาขาในพื้นที่เก็บข้อมูลของคุณ:

$ git branch
* master

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

$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental

หากคุณเพียงต้องการที่จะมองอย่างรวดเร็วที่สาขาต้นน้ำคุณสามารถตรวจสอบได้โดยตรง:

$ git checkout origin/experimental

แต่ถ้าคุณต้องการทำงานในสาขานั้นคุณจะต้องสร้างสาขาการติดตามในพื้นที่ซึ่งดำเนินการโดยอัตโนมัติโดย:

$ git checkout experimental

และคุณจะเห็น

Branch experimental set up to track remote branch experimental from origin.
Switched to a new branch 'experimental'

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

ตอนนี้ถ้าคุณดูสาขาท้องถิ่นของคุณนี่คือสิ่งที่คุณจะเห็น:

$ git branch
* experimental
  master

git remoteจริงๆคุณสามารถติดตามมากกว่าหนึ่งพื้นที่เก็บข้อมูลระยะไกลโดยใช้

$ git remote add win32 git://example.com/users/joe/myproject-win32-port
$ git branch -a
* master
  remotes/origin/HEAD
  remotes/origin/master
  remotes/origin/v1.0-stable
  remotes/origin/experimental
  remotes/win32/master
  remotes/win32/new-widgets

เมื่อมาถึงจุดนี้สิ่งต่าง ๆ ก็เริ่มค่อนข้างบ้าคลั่งดังนั้นgitkโปรดลองดูว่าเกิดอะไรขึ้น:

$ gitk --all &

119
ใครบางคนสามารถสร้างสาขาระยะไกลทั้งหมดได้โดยอัตโนมัติเช่นการทดลองสำหรับที่มา / การทดลอง
Cristian Ciupitu

54
Cristian: ฉันเคยสร้างสาขา 'foo' สำหรับสาขา 'ต้นกำเนิด / foo' ทุกสาขาเสมอ แต่สิ่งนี้นำไปสู่ปัญหาที่สอง: (1) ฉันปิดท้ายด้วยสาขาการติดตามเก่า ๆ ที่เก่าแก่มาก และ (2) ในรุ่นที่เก่ากว่าของ git การใช้ 'git push' จะพยายามผลักดันสาขาในพื้นที่ของฉันทั้งหมดไปยังรีโมตแม้ว่าสาขาเหล่านั้นจะเก่า ดังนั้นตอนนี้ฉันเก็บเฉพาะสาขาในพื้นที่สำหรับสิ่งที่ฉันกำลังพัฒนาและเข้าถึงสาขาต้นทาง / * โดยตรงหากฉันต้องการข้อมูลเกี่ยวกับพวกเขา (ที่กล่าวว่าคุณสามารถใช้สคริปต์เปลือกที่จะแยก '-a สาขาคอมไพล์'.)
EMK

49
"เรียก git <origin-name> <branch-name>" ทำให้สาขาแตกต่างกันไปในตัวคุณ

137
คำตอบที่ดี แต่ก็คิดถึงคำถาม ฉันกำลังมองหาหนึ่งซับเพื่อชำระเงินสาขาที่ห่างไกลทั้งหมด
cmcginty

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

822

หากคุณมีสาขาระยะไกลมากมายที่คุณต้องการดึงข้อมูลในครั้งเดียวให้ทำ:

$ git pull --all

ตอนนี้คุณสามารถเช็คเอาต์สาขาใดก็ได้ตามที่คุณต้องการโดยไม่ต้องกดที่เก็บระยะไกล


12
ถ้าฉันทำคอมไพล์ฉันมีสาขาหลักในประเทศและ 10 สาขา "ระยะไกล" ดังนั้นคำตอบของ Gabe นี้จึงเป็นประโยชน์และตอบคำถาม
basZero

38
นี้เท่านั้นที่สามารถดึงข้อมูลสาขาระยะไกลที่ได้รับการเพิ่มในประเทศไม่ได้ใด ๆสาขาที่ห่างไกล
jujule

33
คำสั่งแรกซ้ำซ้อน เพียงแค่git pull --allจะทำเช่นเดียวกัน - มันจะไม่ดึงสองครั้ง และ infosec812 นั้นถูกต้องแล้วนี่ไม่ตอบคำถามเลย ฉันสงสัยว่าสิ่งนี้มี upvotes มากมาย
Sven Marnach

6
หลังจากที่ฉันgit remote updateลองแล้วgit branchฉันก็เห็นเฉพาะสาขาในท้องที่ แต่ถ้าฉันทำgit branch -aตอนนี้ฉันสามารถดูสาขาระยะไกลและฉันสามารถทำgit pull <branchname>เพื่อให้ได้สาขาที่ฉันต้องการ - ฉันไปถึงคำถามนี้จากการค้นหาของ Google และคำตอบนี้แก้ปัญหาของฉันได้
WNRosenberg

38
สิ่งนี้ไม่เป็นประโยชน์เลยอย่าดึงสาขาระยะไกลอื่นนอกเหนือจากที่มีอยู่
Avinash R

446

สคริปต์Bashนี้ช่วยฉันออก:

#!/bin/bash
for branch in $(git branch --all | grep '^\s*remotes' | egrep --invert-match '(:?HEAD|master)$'); do
    git branch --track "${branch##*/}" "$branch"
done

มันจะสร้างสาขาการติดตามสำหรับสาขาระยะไกลทั้งหมดยกเว้นต้นแบบ (ซึ่งคุณอาจได้รับจากคำสั่งโคลนต้นฉบับ) ฉันคิดว่าคุณยังอาจต้องทำ

git fetch --all
git pull --all

เพื่อให้แน่ใจว่า.

หนึ่งซับ : git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs
ตามปกติ: ทดสอบในการตั้งค่าของคุณก่อนที่จะคัดลอก rm -rf จักรวาลที่เรารู้

เครดิตสำหรับหนึ่งสายการบินไปยังผู้ใช้ CFI


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

51
"One liner": git branch -a | grep -v HEAD | perl -ne 'chomp($_); s|^\*?\s*||; if (m|(.+)/(.+)| && not $d{$2}) {print qq(git branch --track $2 $1/$2\n)} else {$d{$_}=1}' | csh -xfs ตามปกติ: ทดสอบในการตั้งค่าของคุณก่อนที่จะคัดลอกrm -rf universe as we know it
cfi

4
คำสั่งนี้สร้างฟีเจอร์ย่อยจากรีโมตเป็นกิ่งปกติ (ไม่ใช่ฟีเจอร์ย่อย) - จะแก้ไขได้อย่างไร?
Alex2php

4
หากคุณพบปัญหาเกี่ยวกับ "/" ในชื่อสาขามีวิธีแก้ปัญหาด้านล่างโดยใช้นามแฝง git ดูคำตอบโดย "
none

8
ฉันตัดแต่งremotes/origin/เพื่อรักษาเนมสเปซ:for BRANCH in $(git branch -a | grep remotes | grep -v HEAD | grep -v master); do git branch --track "${BRANCH#remotes/origin/}" "${BRANCH}"; done
kgadek

348

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

git clone --mirror path/to/original path/to/dest/.git
cd path/to/dest
git config --bool core.bare false
git checkout anybranch

การอ้างอิง: คำถามที่พบบ่อย Git: ฉันจะโคลนที่เก็บที่มีสาขาที่ติดตามจากระยะไกลทั้งหมดได้อย่างไร


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

27
สิ่งนี้รวมกับ git push --mirror นั้นเป็นสิ่งที่ฉันต้องการในการสร้าง repo ที่แน่นอนของ repo git ระยะไกลเมื่อย้ายจาก github.com ไปยัง gitub องค์กรที่ติดตั้ง ขอบคุณ!
Jacob Fike

3
@Dave: เพิ่มgit checkoutคำสั่งสุดท้ายเป็นคำสั่งสุดท้ายเพื่อเช็คเอาต์ส่วนหัวของสาขาปัจจุบันบน repo ที่ลอกแบบมา นี่คือคำตอบที่ดีโดยที่ดีที่สุด จงกล้าหาญในที่สุดเราจะนำคุณไปสู่อันดับสูงสุด :-)
cfi

3
@Dave: อืม ฉันมีความคิดที่สอง: - สยองขวัญทำมากกว่าแค่ตั้งสาขาทั้งหมดที่ถูกติดตาม มันคัดลอกอ้างอิงทั้งหมดจากแหล่งกำเนิดและต่อมาgit remote updateจะทำเช่นนั้นอีกครั้ง พฤติกรรมของการดึงเปลี่ยน ฉันกลับไปที่การเชื่อว่าสำเนาทั้งหมดต้องใช้สคริปต์บรรทัดเดียว
cfi

5
git clone --mirrorดีมากสำหรับการสำรองที่เก็บคอมไพล์ของคุณ ^ _ ^
TrinitronX

220

คุณสามารถเปลี่ยนเป็นสาขาได้โดยไม่ต้องใช้ไวยากรณ์ "git checkout -b originbranch / somebranch" แฟนซี คุณสามารถทำได้:

git checkout somebranch

Git จะทำสิ่งที่ถูกต้องโดยอัตโนมัติ:

$ git checkout somebranch
Branch somebranch set up to track remote branch somebranch from origin.
Switched to a new branch 'somebranch'

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

หากไม่พบ <branch> แต่มีสาขาการติดตามอยู่ในรีโมทหนึ่งตัว (เรียกว่า <remote>) ด้วยชื่อที่ตรงกันให้ถือว่าเหมือนกับ

$ git checkout -b <branch> --track <remote>/<branch>

1
ดังนั้นหากชื่อของสาขาคุณcheckoutเหมือนกันกับชื่อของสาขาระยะไกลทุกอย่างหลังจาก "/" แล้ว git จะสร้างสาขาที่มีชื่อเดียวกันทุกอย่างหลังจาก "/", "การติดตาม" ที่ห่างไกล ? และติดตามเราหมายถึง: git push, git pullฯลฯ จะทำได้ในระยะไกลที่? หากถูกต้องแล้วให้ขยายคำตอบของคุณด้วยข้อมูลเพิ่มเติมเพราะฉันเห็นด้วยกับ @Daniel คำตอบนี้สมควรได้รับตัวแทนมากขึ้น
เจอราร์ดโรช

5
@BullfrogBlues คำตอบสำหรับทุกคำถามของคุณดูเหมือนจะใช่ (ฉันใช้ git v1.7.7.4) ฉันยอมรับพฤติกรรมนี้ควรเป็นที่รู้จักดีกว่า (ไม่อยู่ในคู่มือสำหรับ git รุ่นนี้) จริง ๆ แล้วฉันไม่ชอบพฤติกรรมนี้ฉันควรได้รับข้อผิดพลาดและต้องพูดgit checkout --track origin/somebranchอย่างชัดเจน
dubiousjim

3
@dubiousjim: จริง ๆ แล้วมันอยู่ในคู่มือ git-checkout (1) พูดว่า: "ถ้าไม่พบ <branch> แต่มีสาขาการติดตามอยู่ในหนึ่งรีโมต (เรียกว่า <remote>) ด้วยชื่อที่ตรงกันให้ถือว่าเป็น 'git checkout -b <branch > - track <remote> / <branch> '"(Git V.1.8.1.1)
sleske

สิ่งที่เราต้องการคือ $ git pull * <remote> / * - โดยที่ "*" เป็น wildcard ดังนั้นจึงดึงสาขาทั้งหมดรวมถึงสาขาที่ยังไม่ได้อยู่ในระบบท้องถิ่น ทำอย่างไร เราควรจะชำระเงิน / ดึงทุกสาขาเพื่อรับรหัสที่ดึงไปยังระบบท้องถิ่นของเราหรือไม่?
JosephK

98

เกี่ยวกับ,

$ git checkout -b แหล่งกำเนิดการทดลอง / การทดลอง

การใช้

$ git checkout -t origin/experimental

หรือยิ่งละเอียดมากขึ้น แต่ง่ายต่อการจดจำ

$ git checkout --track origin/experimental

อาจดีกว่าในแง่ของการติดตามที่เก็บระยะไกล


คุณหมายถึงรูปแบบที่สองนั้นง่ายต่อการจดจำและไม่มีความแตกต่างอื่น ๆ อีกหรือ?
aderchox

79

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

ในการสร้างสาขาในพื้นที่โดยยึดตามสาขาระยะไกลให้ทำดังนี้

git checkout -b dev อ้างอิง / รีโมท / กำเนิด / dev

ซึ่งควรส่งคืนสิ่งที่ชอบ:

Branch dev ตั้งค่าให้ติดตามการอ้างอิงรีโมต / รีโมท / แหล่งกำเนิด / dev ของรีโมตสาขา
เปลี่ยนเป็น "dev" สาขาใหม่

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


14
คุณไม่จำเป็นต้องอ้างอิง / รีโมทที่นี่ git checkout -b dev กำเนิด / dev จะทำงานได้ดี
emk

3
git checkout -b newlocaldev --track origin/devนี้มักจะทำงาน: -b newlocaldevถ้าคุณต้องการที่สาขาท้องถิ่นมีชื่อเดียวกับรีโมทหนึ่งเดียวและเป็นคนที่ห่างไกลไม่ได้มีชื่อหากินคุณสามารถละเว้น ด้วยการเริ่มต้นbranch.autosetupmergeการตั้งค่าการกำหนดค่าและสมมติว่าคุณไม่ได้มีสาขาในประเทศที่มีชื่อdevทั้งสองคำสั่งอาจจะทำสิ่งเดียวกันและเพียงธรรมดาgit checkout -b dev origin/dev git checkout devในที่สุดgit checkout origin/devไม่ได้สร้างสาขาใหม่ แต่เพียงทำให้คุณอยู่ในสถานะ HEAD เดี่ยว
dubiousjim

จะเกิดอะไรขึ้นเมื่อไม่มีรีโมตอยู่อีกต่อไป แต่ Git นั้นโง่เกินกว่าที่จะยอมรับว่ามันถูกลบไปแล้ว? สิ่งนี้จะถือว่าคุณอัปเดตและgit branch -aยังคงแสดงรายการเป็นสาขาระยะไกล
jww

แล้วเราทำอย่างนี้กับหลายสิบสาขา?
JosephK

59

เมื่อคุณทำ "git clone git: // location" จะดึงสาขาและแท็กทั้งหมด

เพื่อทำงานบนสุดของสาขาระยะไกลที่เฉพาะเจาะจงสมมติว่ามันเป็นจุดกำเนิดระยะไกล:

git checkout -b branch origin/branchname

2
ฉันขอขอบคุณบันทึกย่อของคุณ "ดึงแท็กสาขาและแท็กทั้งหมด" ฉันจะแสดงความคิดเห็นต่อคำตอบของคุณว่าผิด แต่จากนั้นฉันตรวจสอบแล้วพบว่าคุณพูดถูก ดังนั้นในทางหนึ่งคุณได้ให้คำตอบที่สั้นที่สุด - ถ้าคุณโคลนคุณมีมันอยู่แล้ว ดี หนึ่งสามารถลองเพิ่ม: พยายามที่$ git branch -aจะเรียนรู้สิ่งที่สาขาระยะไกลมีอยู่แล้ว
Jan Vlcinsky

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

คุณช่วยอธิบายให้ฉันเข้าใจว่าอะไรคือความแตกต่างระหว่างgit checkout -b master origin/masterและgit checkout --track origin/masterโปรด?
aderchox

1
@aderchox ทุกวันนี้ฉันไม่คิดเลย
elmarco

58

ใช้นามแฝง แม้ว่าจะไม่มี linet หนึ่ง Git พื้นเมืองคุณสามารถกำหนดของคุณเองเป็น

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

แล้วใช้มันเป็น

git clone-branches

ขอบคุณ ที่จริงแล้วการโคลนนิ่งกิ่งก้านสาขาทั้งหมดนั้นแตกต่างจากคำตอบอื่น ๆ
FearlessHyena

50

ทำไมคุณเห็น "อาจารย์" เท่านั้น

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

git branch -aแสดงให้เห็นทุกสาขา, รวมทั้งสาขาที่ห่างไกล


วิธีการรับสาขาท้องถิ่น

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

git branch branchone origin/branchone
git branch branchtwo origin/branchtwo
git branch branchthree origin/branchthree

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

git branch localbranchname origin/branchone

เมื่อคุณสร้างสาขาท้องถิ่นแล้วคุณสามารถดูได้ด้วยgit branch(โปรดจำไว้ว่าคุณไม่จำเป็นต้อง-aดูสาขาในท้องถิ่น)


หากorigin/branchoneมีอยู่คุณยังสามารถใช้git checkout branchoneเพื่อสร้างสาขาท้องถิ่นที่มีชื่อเดียวกันและตั้งให้ติดตามระยะไกลได้
Evan

47

นี่ไม่ซับซ้อนเกินไปขั้นตอนที่ง่ายและตรงไปตรงมามีดังนี้

git fetch origin สิ่งนี้จะนำกิ่งไม้ที่อยู่ห่างไกลมาสู่ท้องที่ของคุณ

git branch -a นี่จะแสดงให้คุณเห็นทุกสาขาที่อยู่ห่างไกล

git checkout --track origin/<branch you want to checkout>

ตรวจสอบว่าคุณอยู่ในสาขาที่ต้องการโดยคำสั่งดังต่อไปนี้;

git branch

ผลลัพธ์จะเป็นเช่นนี้

*your current branch 
some branch2
some branch3 

สังเกตเห็นเครื่องหมาย * ที่แสดงถึงสาขาปัจจุบัน


1
ขอบคุณ suraj เหตุผลเพราะมันไม่ได้รับการโหวตมาก และผู้ตอบคำถามก็ไม่ได้รับการยอมรับ
Sam

"ต้นกำเนิดการดึง git" ไม่ได้นำกิ่งไม้อันห่างไกลมายังท้องถิ่นของฉัน - หรือซ่อนอยู่ที่ไหนสักแห่ง? การอ่านคำตอบทั้งหมดข้างต้นทำให้ฉันปวดหัว เรากำลังมองหา "git เรียกทุกสาขาสู่ท้องถิ่น" ต้องมีวิธีนอกเหนือจาก bash-สคริปต์เพื่อทำสิ่งนี้
JosephK

1
หลังจากที่คุณรัน "git fetch origin" มันจะแสดงผลลัพธ์เช่นนี้ในเทอร์มินัลของคุณ - "* [branch ใหม่] branch_name -> origin / branch_name" แต่เมื่อคุณเรียกใช้ "git branch" มันจะแสดงเฉพาะที่ท้องถิ่นของคุณ ดังนั้นหากต้องการดูสาขาทั้งหมดที่คุณสามารถทำได้ "git branch -a" จากนั้นเปลี่ยนเป็นสาขาระยะไกลคุณต้องเรียกใช้ "git checkout - track origin / <branch ที่คุณต้องการเช็คเอาต์>" หวังว่านี่จะช่วยได้ :-)
Sam

4
Suraj เนื่องจากคำถามคือวิธี "โคลนสาขาระยะไกลทั้งหมด" - ไม่ใช่วิธีการอัปเดตทีละครั้งด้วยตนเอง ดูเหมือนว่าไม่มีคำตอบสำหรับคำถามที่เกิดขึ้นจริง - เพียงวิธีการพิมพ์จำนวนมากหากคุณมีสาขาจำนวนมาก
JosephK

47

ดีกว่าไม่สาย แต่นี่เป็นวิธีที่ดีที่สุดในการทำสิ่งนี้:

mkdir repo
cd repo
git clone --bare path/to/repo.git .git
git config --unset core.bare
git reset --hard

ณ จุดนี้คุณมีสำเนา repo ระยะไกลที่สมบูรณ์พร้อมด้วยสาขาทั้งหมดของมัน (ยืนยันด้วยgit branch) คุณสามารถใช้--mirrorแทน--bareถ้า repo ระยะไกลของคุณมีรีโมทของตัวเอง


มีบางอย่างผิดพลาดในระหว่างการแก้ไขที่นี่ ตอนนี้คำตอบนี้ไม่สมเหตุสมผล " --bare" ที่กล่าวถึงในประโยคสุดท้ายไม่มีอยู่ในรายการคำสั่งที่ระบุ
Cerran

นำมาจากคำตอบของเดฟด้านล่าง การใช้ 'git config --bool core.bare false' แทน 'git config unset core.bare' ดูเหมือนว่าจะทำงาน
Vorlon สับสน

error: key does not contain a section: unsetฉันมี คำตอบของเดฟทำงานได้ดีขึ้น
olibre

มันเป็นgit config --unset core.bareจริง ... ฉันนี้ดูเหมือนว่าทางออกที่สะอาดทั้งหมดที่นำเสนอในคำตอบที่นี่ น่าเสียดายที่มีผู้
โหวต

1
ขอบคุณ @ChrisSim git config --bool core.bare falseผมเห็นด้วยสำหรับ นี่คือเหตุผลที่ผมขอแนะนำให้แทนคำตอบของเดฟ คุณคิดอย่างไรเกี่ยวกับคำตอบของ Dave ? ไชโย
โอลิเบร

39

แค่ทำสิ่งนี้:

$ git clone git://example.com/myproject
$ cd myproject
$ git checkout branchxyz
Branch branchxyz set up to track remote branch branchxyz from origin.
Switched to a new branch 'branchxyz'
$ git pull
Already up-to-date.
$ git branch
* branchxyz
  master
$ git branch -a
* branchxyz
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/branchxyz
  remotes/origin/branch123

คุณเห็นแล้วว่า 'git clone git: //example.com/myprojectt' ดึงข้อมูลทุกอย่างแม้แต่กิ่งก้านคุณต้องชำระเงินพวกเขาจากนั้นสาขาท้องถิ่นของคุณจะถูกสร้างขึ้น


25

คุณจะต้องใช้ "git clone" เพื่อรับทุกสาขา

git clone <your_http_url>

แม้ว่าคุณจะเห็นเฉพาะสาขาหลักคุณสามารถใช้ "git branch -a" เพื่อดูสาขาทั้งหมด

git branch -a

และคุณสามารถเปลี่ยนเป็นสาขาใดก็ได้ที่คุณมีอยู่แล้ว

git checkout <your_branch_name>

ไม่ต้องกังวลว่าหลังจากคุณ "git clone" คุณไม่จำเป็นต้องเชื่อมต่อกับ repo ระยะไกล "git branch -a" และ "git checkout" สามารถทำงานได้สำเร็จเมื่อคุณปิด wifi ดังนั้นจึงพิสูจน์ได้ว่าเมื่อคุณทำ "git clone" มันได้ทำการคัดลอกกิ่งทั้งหมดจาก repo ระยะไกลแล้ว หลังจากนั้นคุณไม่จำเป็นต้องซื้อ repo ระยะไกลท้องถิ่นของคุณมีรหัสสาขาทั้งหมดแล้ว


คำตอบที่ชัดเจนมากที่นี่ หลายคนสับสนเกี่ยวกับหัวข้อนี้
XMAN

ฉันต้องการอันดับที่สองของคุณ "สามารถทำงานได้สำเร็จเมื่อคุณปิด wifi" "git clone" ส่งผลให้ repo ที่มีสาขาทั้งหมด
bvgheluwe

คำตอบที่ชัดเจนตรงไปตรงมาที่ดี
Amr

24

A git cloneควรจะคัดลอกที่เก็บทั้งหมด git branch -aลองโคลนมันและเรียกใช้ มันควรจะแสดงรายการทุกสาขา ถ้าท่านต้องการเปลี่ยนไปสาขา "foo" แทนที่จะเป็น "ต้นแบบ" git checkout fooการใช้งาน


1
คุณสามารถรันคำสั่ง git โดยใช้เครื่องหมายยัติภังค์หรือไม่ใส่ก็ได้ ทั้ง "สาขา git" และ "สาขา git" จะทำงาน
Peter Boughton

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

ขอบคุณ. นี่เป็นพฤติกรรมเริ่มต้นที่แปลกประหลาดของ IMO ฉันแค่จะชอล์กมันให้มากขึ้นเพื่อเป็นพยานถึงความลับ ถ้ามันดาวน์โหลดสาขาทำไมมันจะซ่อนพวกเขาเมื่อเรียกสาขา git?
Adam Hughes

1
@Cerran ขอบคุณ; ฉันได้อัพเดตคำตอบแล้ว
MattoxBeckman

"ดาวน์โหลดสาขาระยะไกลทั้งหมด แต่สร้างเฉพาะสาขาหลักของท้องถิ่น". ฉันต้องการความช่วยเหลือในการทำความเข้าใจสิ่งนี้ ดูเหมือนว่า git clone จะไม่ทำการโคลนสาขาใด ๆ ยกเว้นมาสเตอร์เช่นเดียวกับเมื่อคุณทำ "git branch -a" มันแสดงให้เห็นว่าสาขา "ที่พัฒนา" นั้นอยู่ที่ "รีโมต / แหล่งกำเนิด / พัฒนา" เท่านั้น นี่ต้องบอกว่าคุณไม่มีสาขานี้ทุกที่ในท้องถิ่นมันมีอยู่ในที่เดิมใช่มั้ย
John Little

19

ใช้เครื่องมือของฉันgit_remote_branch (คุณต้องติดตั้ง Ruby บนเครื่องของคุณ) มันถูกสร้างขึ้นโดยเฉพาะเพื่อให้การจัดการสาขาระยะไกลเป็นเรื่องง่าย

ทุกครั้งที่ดำเนินการในนามของคุณมันจะพิมพ์เป็นสีแดงที่คอนโซล เมื่อเวลาผ่านไปในที่สุดพวกเขาก็ติดอยู่ในสมองของคุณ :-)

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

ในที่สุดคำสั่งทั้งหมดมีนามแฝงเพื่อให้การท่องจำง่ายขึ้น

โปรดทราบว่านี่เป็นซอฟต์แวร์อัลฟ่า ;-)

นี่คือความช่วยเหลือเมื่อคุณเรียกใช้ความช่วยเหลือ grb:

git_remote_branch รุ่น 0.2.6

  การใช้งาน:

  grb สร้าง branch_name [origin_server] 

  grb เผยแพร่ branch_name [origin_server] 

  grb เปลี่ยนชื่อ branch_name [origin_server] 

  grb ลบ branch_name [origin_server] 

  ติดตาม GR_ branch_name [origin_server] 



  หมายเหตุ:
  - หากไม่ได้ระบุ origin_server ระบบจะถือว่าชื่อ 'ต้นกำเนิด' 
    (ค่าเริ่มต้นของคอมไพล์)
  - ฟังก์ชั่นการเปลี่ยนชื่อเปลี่ยนชื่อสาขาปัจจุบัน

  คำอธิบาย meta-command: คุณยังสามารถผนวกคำสั่งใด ๆ ด้วย 
คำหลัก 'อธิบาย' แทนที่จะเรียกใช้คำสั่ง git_remote_branch
จะเอาท์พุทรายการคำสั่งที่คุณต้องการเพื่อให้ทำงานได้ 
เป้าหมายนั้น

  ตัวอย่าง: 
    grb อธิบายการสร้าง
    grb อธิบายสร้าง my_branch github

  คำสั่งทั้งหมดมีนามแฝงด้วย:
  สร้าง: สร้างใหม่
  ลบ: ลบ, ทำลาย, ฆ่า, ลบ, rm
  เผยแพร่: เผยแพร่, Remotize
  เปลี่ยนชื่อ: เปลี่ยนชื่อ, rn, mv, move
  ติดตาม: ติดตามติดตามคว้าดึงข้อมูล

6
Word to a wise: ดูเหมือนว่าโครงการนี้จะถูกละทิ้งในช่วงเวลาที่คำตอบนี้ถูกโพสต์ ฉันไม่พบการปรับปรุงใด ๆ หลังจากปี 2008 Caveat emptor และทั้งหมดนั้น ถ้าฉันผิดฉันหวังว่าจะมีใครบางคนแก้ไขและให้ตัวชี้ปัจจุบันเพราะฉันชอบที่จะมีเครื่องมือเช่นนี้มีประโยชน์
bradheintz

@bradheintz ตรวจสอบคำตอบนี้มันตั้งค่านามแฝงคอมไพล์: stackoverflow.com/a/16563327/151841
151841

19

คำตอบทั้งหมดที่ฉันเห็นที่นี่ถูกต้อง แต่มีวิธีที่สะอาดกว่ามากในการโคลนที่เก็บและดึงสาขาทั้งหมดในครั้งเดียว

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

$ git branch -a

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

$ git checkout -b branchname origin/branchname

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


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

  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" จากเทอร์มินัล

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

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

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

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

$ git reset --hard

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

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


ฉันไม่ชอบการใช้งานของคำว่า "ดาวน์โหลด" ใน ... "ดาวน์โหลด" พวกเขาด้วยตนเองในช่วงเวลาหนึ่ง ที่จริงแล้วข้อมูลทั้งหมดนั้นได้ถูกดาวน์โหลดไปแล้วหลังจากทำการโคลน repo สิ่งเดียวที่ต้องทำคือการสร้างสาขาการติดตามในท้องถิ่น (ซึ่งเป็นไปได้เมื่อออฟไลน์ซึ่งพิสูจน์ว่าข้อมูลทั้งหมดอยู่ใน repo)
bvgheluwe

@bvgheluwe นั่นเป็นเหตุผลที่อยู่ในเครื่องหมายคำพูด
FedericoCapaldo

15

การโคลนนิ่งจาก repo ในพื้นที่จะไม่ทำงานกับ git clone & git fetch: กิ่ง / แท็กจำนวนมากจะยังไม่ถูกดึงออกมา

เพื่อให้ได้โคลนกับกิ่งและแท็กทั้งหมด

git clone --mirror git://example.com/myproject myproject-local-bare-repo.git

ในการรับโคลนที่มีสาขาและแท็กทั้งหมด แต่มีสำเนาที่ใช้งานได้:

git clone --mirror git://example.com/myproject myproject/.git
cd myproject
git config --unset core.bare
git config receive.denyCurrentBranch updateInstead
git checkout master

13

ตกลงเมื่อคุณโคลน repo คุณมีสาขาทั้งหมดที่นั่น ...

หากคุณเพิ่งทำgit branchพวกเขาเป็นชนิดที่ซ่อนอยู่ ...

ดังนั้นหากคุณต้องการเห็นชื่อสาขาทั้งหมดเพียงเพิ่ม--allแฟลกแบบนี้:

git branch --all หรือ git branch -a

หากคุณเพียงแค่ชำระเงินที่สาขาคุณจะได้รับทุกอย่างที่ต้องการ

แต่ถ้าสาขาที่สร้างโดยคนอื่นหลังจากที่คุณโคลน?

ในกรณีนี้เพียงทำ:

git fetch

และตรวจสอบทุกสาขาอีกครั้ง ...

หากคุณต้องการดึงข้อมูลและชำระเงินในเวลาเดียวกันคุณสามารถทำได้:

git fetch && git checkout your_branch_name

สร้างภาพด้านล่างเพื่อให้คุณเข้าใจสิ่งที่ฉันพูดด้วย:

git branch - ทุกสาขา


3
มีความแตกต่างระหว่าง "คุณมี" และ "คุณเห็นมัน" git branch - ทั้งหมดจะไม่แสดงรายการ remote branch อีกต่อไปเมื่อคุณลบ repository ระยะไกล
กุสตาฟ

12

ดูหนึ่งในคำตอบของคำถามที่ฉันสังเกตเห็นว่าเป็นไปได้ที่จะย่อให้สั้นลง:

for branch in  `git branch -r | grep -v 'HEAD\|master'`; do  
 git branch --track ${branch##*/} $branch;
done

แต่ระวังถ้าหนึ่งในสาขาระยะไกลมีชื่อเป็นเช่น admin_master มันจะไม่ได้รับการดาวน์โหลด!

ขอบคุณ Bigfish สำหรับแนวคิดดั้งเดิม


คุณสามารถปรับปรุง regex หรืออาจใช้ Awk แทนgrepเพื่อปรับปรุงตัวกรองเพื่อหลีกเลี่ยงผลบวกปลอม
tripleee

สาขาทั้งหมดเป็น 'ต้นกำเนิด \ my_branch_name' ซึ่งไม่ใช่สิ่งที่ฉันต้องการอย่างแน่นอน
Sнаđошƒаӽ

ฉันไม่เคยเห็นโครงสร้าง $ {branch ## * /} มาก่อน - ดูมีประโยชน์จริง ๆ - ความคิดใดที่ฉันสามารถหาข้อมูลเพิ่มเติมเกี่ยวกับสิ่งนั้นได้ ดูเหมือนจะไม่สามารถพบได้ภายใต้การทุบตีที่ใดก็ได้ ขอบคุณ.
SaminOz


10

สำหรับการคัดลอกวางลงในบรรทัดคำสั่ง:

git checkout master ; remote=origin ; for brname in `git branch -r | grep $remote | grep -v master | grep -v HEAD | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'`; do git branch -D $brname ; git checkout -b $brname $remote/$brname ; done ; git checkout master

สำหรับการอ่านเพิ่มเติม:

git checkout master ;
remote=origin ;
for brname in `
    git branch -r | grep $remote | grep -v master | grep -v HEAD 
    | awk '{gsub(/^[^\/]+\//,"",$1); print $1}'
`; do
    git branch -D $brname ;
    git checkout -b $brname $remote/$brname ;
done ;
git checkout master


นี่จะ:

  1. ตรวจสอบหลัก (เพื่อให้เราสามารถลบสาขาที่เราอยู่)
  2. เลือกรีโมตเพื่อเช็คเอาต์ (เปลี่ยนเป็นรีโมตที่คุณมี)
  3. วนซ้ำผ่านรีโมททั้งหมดยกเว้นมาสเตอร์และ HEAD
    1. ลบสาขาในพื้นที่ (เพื่อให้เราสามารถตรวจสอบสาขาที่อัปเดตแรง)
    2. ตรวจสอบสาขาจากระยะไกล
  4. ตรวจสอบอาจารย์ (เพื่อประโยชน์ของมัน)

ขึ้นอยู่กับคำตอบของVonC


10

ฉันได้เขียนฟังก์ชั่นPowershellขนาดเล็กนี้เพื่อให้สามารถชำระเงินสาขา git ทั้งหมดของฉันซึ่งอยู่ห่างไกลจากแหล่งกำเนิด

Function git-GetAllRemoteBranches {
     iex "git branch -r"                       <# get all remote branches #> `
     | % { $_ -Match "origin\/(?'name'\S+)" }  <# select only names of the branches #> `
     | % { Out-Null; $matches['name'] }        <# write does names #>
}


Function git-CheckoutAllBranches {
    git-GetAllRemoteBranches `
        | % { iex "git checkout $_" }          <# execute ' git checkout <branch>' #>
}

ฟังก์ชั่น git เพิ่มเติมสามารถพบได้บนrepo settings git


9

นี่คือคำตอบที่ใช้ awk วิธีนี้ควรพอเพียงถ้าใช้กับ repo ใหม่

git branch -r | awk -F/ '{ system("git checkout " $NF) }'

สาขาที่มีอยู่จะถูกเช็คเอาท์หรือประกาศเป็นสาขาอยู่แล้ว แต่สามารถเพิ่มตัวกรองเพื่อหลีกเลี่ยงความขัดแย้ง

มันยังสามารถแก้ไขได้ดังนั้นจึงเรียกgit checkout -b <branch> -t <remote>/<branch>คำสั่งที่ชัดเจน

คำตอบนี้ดังนี้Nikos ซี 's ความคิด


หรือเราสามารถระบุสาขาระยะไกลแทน นี้อยู่บนพื้นฐานmurphytalk 's คำตอบ

git branch -r | awk '{ system("git checkout -t " $NF) }'

มันส่งข้อความแสดงข้อผิดพลาดร้ายแรงถึงข้อขัดแย้ง แต่ฉันเห็นว่าไม่เป็นอันตราย


คำสั่งทั้งสองสามารถเป็นนามแฝง

ใช้คำตอบของไม่มีใครเป็นข้อมูลอ้างอิงเราสามารถมีคำสั่งต่อไปนี้เพื่อสร้างนามแฝง:

git config --global alias.clone-branches '! git branch -r | awk -F/ "{ system(\"git checkout \" \$NF) }"'
git config --global alias.clone-branches '! git branch -r | awk "{ system(\"git checkout -t \" \$NF) }"'

ส่วนตัวผมต้องการใช้หรือtrack-alltrack-all-branches


แค่อยากจะขอบคุณ นี้ทำงานได้อย่างสมบูรณ์แบบและมันไม่ได้ประสบปัญหาต่างๆที่เกี่ยวข้องกับโคลน repo เปลือยเช่นพฤติกรรมการดึงบางส่วนเปลี่ยนแปลง ฯลฯ
mahonya

8

ฉันต้องการทำสิ่งเดียวกัน นี่คือสคริปต์Rubyของฉัน

#!/usr/bin/env ruby

local = []
remote = {}

# Prepare
%x[git reset --hard HEAD]
%x[git checkout master] # Makes sure that * is on master.
%x[git branch -a].each_line do |line|
  line.strip!
  if /origin\//.match(line)
     remote[line.gsub(/origin\//, '')] = line
   else
     local << line
   end
end
# Update 
remote.each_pair do |loc, rem|
  next if local.include?(loc)
  %x[git checkout --track -b #{loc} #{rem}]
end
%x[git fetch]

ดูคำตอบที่ฉันโพสต์ลงไปอีกเพื่อหลีกเลี่ยงการเรียกใช้สคริปต์นี้เลย
lacostenycoder

8

ไม่มีคำตอบใด ๆ ที่ถูกตัดออกไปยกเว้นผู้ใช้ที่ไม่มีใครติดตามถูกต้อง

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

ดังนั้นฉันจึงพบว่าทั้งสองวิธีมีประโยชน์มาก หวังว่าพวกเขาจะช่วยคนอื่น

วิธีที่ 1:

git clone --mirror OLD_REPO_URL
cd new-cloned-project
mkdir .git
mv * .git
git config --local --bool core.bare false
git reset --hard HEAD
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo

วิธีที่ 2:

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'
git clone OLD_REPO_URL
cd new-cloned-project
git clone-branches
git remote add newrepo NEW_REPO_URL
git push --all newrepo
git push --tags newrepo

8

git clone --mirror ใน repo เดิมทำงานได้ดีสำหรับเรื่องนี้

git clone --mirror /path/to/original.git
git remote set-url origin /path/to/new-repo.git
git push -u origin

7

โดยทั่วไป Git (เมื่อไม่ได้ระบุ) จะดึงสาขาและ / หรือแท็กทั้งหมด (อ้างอิงโปรดดู:) git ls-refsจากที่เก็บอื่น ๆ หนึ่งแห่งขึ้นไปพร้อมกับวัตถุที่จำเป็นในการเติมเต็มประวัติของพวกเขา กล่าวอีกนัยหนึ่งคือดึงวัตถุที่สามารถเข้าถึงได้โดยวัตถุที่ดาวน์โหลดมาแล้ว ดู: ทำอะไรgit fetchจริงเหรอ?

บางครั้งคุณอาจมีสาขา / แท็กที่ไม่ได้เชื่อมต่อโดยตรงกับสาขาปัจจุบันดังนั้นgit pull --all/ git fetch --allจะไม่ช่วยในกรณีนั้น แต่คุณสามารถแสดงรายการโดย:

git ls-remote -h -t origin

และดึงข้อมูลด้วยตนเองโดยรู้จักชื่ออ้างอิง

หากต้องการดึงข้อมูลทั้งหมดให้ลอง:

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

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

จากนั้นตรวจสอบสาขาทั้งหมดของคุณอีกครั้ง:

git branch -avv

ถ้าข้างต้นไม่ช่วยคุณต้องเพิ่มสาขาที่ขาดหายไปด้วยตนเองในรายการที่ติดตาม (เพราะพวกเขาหลงทาง)

$ git remote -v show origin
...
  Remote branches:
    master      tracked

โดยgit remote set-branchesชอบ:

git remote set-branches --add origin missing_branch

ดังนั้นจึงอาจปรากฏภายใต้การremotes/originดึงข้อมูล:

$ git remote -v show origin
...
  Remote branches:
    missing_branch new (next fetch will store in remotes/origin)
$ git fetch
From github.com:Foo/Bar
 * [new branch]      missing_branch -> origin/missing_branch

การแก้ไขปัญหา

หากคุณยังไม่สามารถรับสิ่งอื่นนอกเหนือจากสาขาหลักให้ตรวจสอบสิ่งต่อไปนี้:

  • ตรวจสอบรีโมทของคุณอีกครั้ง ( git remote -v) เช่น
    • ตรวจสอบว่าเป็นgit config branch.master.remoteorigin
    • ตรวจสอบว่าoriginชี้ไปยัง URL ที่ถูกต้องผ่าน: git remote show origin(ดูโพสต์นี้)

7

ตั้งแต่ต้นปี 2560 คำตอบในความคิดเห็นนี้ใช้ได้ผล:

git fetch <origin-name> <branch-name>นำสาขาลงมาเพื่อคุณ แม้ว่าสิ่งนี้จะไม่ดึงสาขาทั้งหมดในครั้งเดียว แต่คุณสามารถดำเนินการต่อสาขาได้อย่างแปลกประหลาด


สิ่งนี้ต้องการให้คุณดึงข้อมูลแต่ละสาขาทีละครั้ง ไม่ค่อยดีถ้าคุณมีสาขามากมาย
lacostenycoder

6

นี่เป็นอีกหนึ่งคำสั่งสั้นซับหนึ่งซึ่งสร้างสาขาท้องถิ่นสำหรับสาขาระยะไกลทั้งหมด:

(git branch -r | sed -n '/->/!s#^  origin/##p' && echo master) | xargs -L1 git checkout

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

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

git branch -r | sed -n '/->/!s#^  origin/##p'| xargs -L1 git checkout
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.