ตั้งค่าคอมไพล์เพื่อดึงและดันกิ่งไม้ทั้งหมด


615

ฉันต้องการที่จะผลักดันและดึงกิ่งไม้ทั้งหมดตามค่าเริ่มต้นรวมถึงกิ่งที่สร้างขึ้นใหม่

มีการตั้งค่าที่ฉันสามารถกำหนดได้หรือไม่?

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

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


4
"และพยายามดึง แต่ก็ใช้ไม่ได้" รายละเอียดโปรด แสดงให้เราทราบว่าคุณพยายามใช้คำสั่งใด
Jakub Narębski

คำตอบ:


1297

วิธีที่ง่ายที่สุดคือทำ:

git push --all origin

สิ่งนี้จะผลักแท็กและกิ่งก้าน


10
ในบรรดาคำตอบมากมายที่ฉันพบใน SO และที่อื่น ๆ นี่เป็นวิธีที่ง่ายที่สุดในการผลักดันสาขาที่สร้างขึ้นใหม่โดยไม่ต้องตั้งค่าแบบสัมผัส ขอบคุณ!
AndrásSzepesházi

174
และถ้าคุณเพิ่ม-uครั้งเดียวเช่นการติดตามการติดตั้งและหลังจากนั้นคุณก็สามารถใช้git push --all origin -u git push
อเล็กซ์

23
สำหรับ git เวอร์ชั่น 1.7.12.3 ฉันต้องใช้git push --tags originเพื่อผลักดันแท็กทั้งหมด
thisgeek

17
ดูที่ "- มิเรอร์" แทน "- ทั้งหมด" สิ่งนี้จะผลักดันสิ่งอื่น ๆ อีกมากมาย
Loda

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

147

ด้วยคอมไพล์ที่ทันสมัยคุณจะดึงสาขาทั้งหมด (เป็นสาขาการติดตามระยะไกลในrefs/remotes/origin/*เนมสเปซมองเห็นได้ด้วยgit branch -rหรือgit remote show origin)

โดยค่าเริ่มต้น (ดูเอกสารของpush.defaultตัวแปรการตั้งค่า) คุณผลักดันสาขาการจับคู่ซึ่งหมายความว่าเป็นครั้งแรกที่คุณต้องทำสำหรับคอมไพล์ที่จะผลักดันมันเสมอgit push origin branchgit push

หากคุณต้องการผลักดันทุกสาขาคุณสามารถตั้งค่าการผลักดันการอ้างอิง สมมติว่าชื่อระยะไกลoriginคุณสามารถใช้การตั้งค่าgit :

$ git config --add remote.origin.push '+refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push '+refs/tags/*:refs/tags/*'

หรือแก้ไข.git/configไฟล์โดยตรงเพื่อให้มีสิ่งต่อไปนี้:

[รีโมท "กำเนิด"]
        url = user@example.com: /srv/git/repo.git
        fetch = + refs / heads / *: refs / remotes / origin / *
        fetch = + refs / tags / *: refs / tags / *
        push = + refs / heads / *: refs / heads / *
        push = + refs / tags / *: refs / tags / *

3
@Merc: git push --all originดีสำหรับการเผยแพร่ทุกครั้งที่สาขาและแท็กแม้ว่าค่าเริ่มต้นจนถึงความหมายของการจับคู่ 'รุ่นปัจจุบัน' หมายความว่าคุณจะผลักสาขาทั้งหมดในภายหลัง ... เว้นแต่คุณจะเพิ่มสาขาหรือแท็กใหม่ การตั้งค่าเป็น"push [... ] ทุกสาขาโดยค่าเริ่มต้น"เป็นไปตามที่เขียนไว้
Jakub Narębski

คุณสามารถปรับปรุงคำตอบเพื่อเพิ่มวิธีการกำหนดค่า Git ใหม่ด้วยวิธีนี้ สิ่งนี้มีประโยชน์สำหรับผู้ใช้ที่ตั้งค่าโหมดง่าย ๆ
Dereckson

3
สิ่งนี้มีการเปลี่ยนแปลงตั้งแต่ git 2.0 ค่าเริ่มต้นการพุชนั้นง่ายไม่เหมือนใคร
ไมค์

ฉันลองสิ่งนี้และพบข้อผิดพลาดในการกด: fatal: Invalid refspec ''+refs/heads/*:refs/heads/*'' (หมายเหตุ: ฉันใช้ git 2.0 อยู่ฉันยังคงหาวิธีแก้ไขปัญหานี้อยู่)
Brian Lacy

2
ตอนนี้ค่าเริ่มต้นสำหรับการมีpush.default simple
hasanghaforian

32

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

ลองแค่นี้:

$ git config --add remote.origin.push 'refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push 'refs/tags/*:refs/tags/*'
$ git config --add remote.origin.fetch 'refs/heads/*:refs/remotes/origin/*'
$ git config --add remote.origin.fetch 'refs/tags/*:refs/tags/*'

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

มันเป็นโชคร้ายที่ + git remote addจะถูกเพิ่มโดยอัตโนมัติโดยการคอมไพล์เมื่อทำ
อีเธอร์

26

ฉันใช้คำสั่งด้านล่างเพื่อย้ายสาขาทั้งหมดไปยังที่เก็บใหม่

~$ git clone --mirror <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin master
~$ git push new-origin --mirror

หมายเหตุ : ฉันต้องใช้คำสั่งที่สอง (เช่น push master ก่อน) ในขณะที่โคลน repo จาก Atlassian Stashไปยัง AWS CodeCommit (repo เปล่า) ผมไม่แน่ใจว่าเหตุผล แต่หลังจากผลักดัน ( git push new-origin --mirror) masterสาขาเริ่มต้นหมายถึงบางสาขาอื่นที่ไม่ใช่


1
สมบูรณ์แบบสำหรับการย้าย repo ไปยังโฮสต์อื่น ขอบคุณ!
Pelmered

2
นี่เป็นวิธีการที่มีประโยชน์เท่านั้น ใช้git push new_origin --allเพียงแค่ผลักสาขาปัจจุบันของคุณไปที่ new_origin ไม่ใช่สาขาต้นทางทั้งหมด
yanzi1225627

เพิ่งสังเกตว่าสิ่งนี้ทำให้ที่--bareเก็บซึ่งแตกต่างจากที่เก็บทั่วไปเพียงเล็กน้อยเท่านั้นที่มี.gitไฟล์ไม่ใช่ไฟล์ของคุณ มันเพียงพอแล้วถ้าคุณไม่ไปทำงานด้วย ดู--bareและgit-scm.com/docs/git-clone--mirror
jmmut

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

นี่คือผู้ช่วยชีวิต! วิธีการ "ต้นแบบก่อนสะท้อน" นี้แก้ไขปัญหาด้วย Bitbucket ที่เป็นปลายทางและเชื่อว่าสาขาอื่นที่ไม่ใช่ "ต้นแบบ" เป็นสาขาหลัก
Toddius Zho

12

หากคุณกำลังย้ายสาขาไปยัง repo ใหม่จากสาขาเก่าและไม่มี Repo สาขาเก่าทั้งหมดในพื้นที่คุณจะต้องติดตามพวกเขาก่อน

for remote in `git branch -r | grep -v '\->'`; do git branch --track $remote; done

จากนั้นเพิ่ม repo ระยะไกลใหม่ของคุณ:

git remote add bb <path-to-new-repo>

จากนั้นคุณสามารถผลักดันทั้งหมดโดยใช้คำสั่งนี้:

git push -u bb --all

หรือคุณสามารถกำหนดค่า repo โดยใช้คำสั่ง git config ที่ระบุไว้ในคำตอบอื่น ๆ ที่นี่หากคุณไม่ได้ทำครั้งเดียวหรือต้องการย้ายสาขาในพื้นที่เท่านั้น

จุดสำคัญการตอบสนองอื่น ๆ เพียงผลักสาขา LOCAL ทั้งหมด หากสาขานั้นมีอยู่บนที่เก็บสำรอง REMOTE สำรองพวกเขาจะไม่ย้ายโดยไม่ติดตามก่อน การวนซ้ำที่นำเสนอที่นี่จะช่วยได้


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

2
นั่นไม่ได้ผลสำหรับฉัน สิ้นสุดด้วยสาขาระยะไกลทั้งหมดติดตามสาขาในพื้นที่เดียวกัน: /
jhsowter

2
AFAIK สิ่งนี้ไม่สามารถใช้งานได้ตามความคิดเห็น @jhsowter คำสั่งที่เหมาะสมสำหรับฉันในการติดตามสาขาระยะไกลใน repo ที่เพิ่งถูกโคลนเป็นgit branch --track reponame origin/reponameอย่างอื่นคุณจะได้รับสาขาระยะไกลทั้งหมดที่ติดตามในสาขาท้องถิ่นปัจจุบัน
Pioneer Skies

ฉันเปลี่ยนตัวอย่างการเก็บรวบรวม repo เป็นgit branch -r | grep -v '\->' | sed 's/ origin\///'ซึ่งให้เพียงชื่อสาขาระยะไกล
พอลฮิกส์

6

หากต้องการดูสาขาทั้งหมดโดยไม่ใช้git branch -aคุณควรดำเนินการ:

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

ตอนนี้คุณสามารถดูสาขาทั้งหมด:

git branch

เพื่อผลักดันกิ่งไม้ทั้งหมดลอง:

git push --all

1
λ git fetch - ต้นกำเนิดทั้งหมดร้ายแรง: fetch - ไม่ใช้อาร์กิวเมนต์ที่เก็บ
foxundermon

คุณกำลังพยายามgit fetch --all?
tokhi

4

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

for remote in `git branch -r | grep -v '\->' | grep -v master`; do git branch --track `echo $remote|sed 's=origin/=='` `echo $remote`; done

คำสั่งหนึ่งบรรทัดนี้ขึ้นอยู่กับเวอร์ชันของคำตอบอื่น ๆ ในหน้านี้ แต่จะดีกว่าเนื่องจาก:

  1. มันตั้งค่าการติดตามสาขาอย่างถูกต้องซึ่งแตกต่างจากรุ่นเก่าบางส่วนของคำสั่งนี้ในหน้านี้ซึ่งระบุพารามิเตอร์เดียวให้กับ - แทร็กและทำให้แต่ละสาขาสิ้นสุดการติดตามต้นแบบ - ไม่ดี
  2. ตั้งชื่อสาขาในท้องที่โดยไม่มีคำนำหน้า“ จุดกำเนิด /” ที่ฉันไม่ต้องการ - และสอดคล้องกับสิ่งที่เกิดขึ้นเมื่อคุณชำระเงินตามปกติ
  3. ข้ามการติดตามหลักตั้งแต่ที่เกิดขึ้นแล้ว
  4. ไม่ได้เช็คเอาท์อะไรเลยอย่างรวดเร็ว
  5. หลีกเลี่ยงการสะดุด -> ในเอาต์พุตของ git branch -r

ถัดไปหากคุณเปลี่ยนแหล่งกำเนิดให้เปลี่ยนลิงค์ไปยังแหล่งกำเนิดเก่าและชี้ไปที่รีโมตใหม่ ตรวจสอบให้แน่ใจว่าคุณสร้างรีโมตใหม่ก่อนโดยใช้ bitbucket / github GUI แต่ไม่ต้องเพิ่มไฟล์ใด ๆ ลงไปมิฉะนั้นจะเกิดปัญหาการรวม เช่น

git remote set-url origin git@bitbucket.org:YOUR/SOMEREPO.git

ตอนนี้ดัน หมายเหตุจำเป็นต้องใช้คำสั่งที่สองในการพุชแท็กด้วย:

git push -u --all origin
git push --tags origin

0

โซลูชันที่ไม่มีการเข้ารหัสoriginในการกำหนดค่า

ใช้สิ่งต่อไปนี้ในgitconfig ทั่วโลกของคุณ

[remote]
    push = +refs/heads/*
    push = +refs/tags/*

สิ่งนี้จะผลักดันทุกสาขาและแท็กทั้งหมด

ทำไมคุณไม่ควร hardcode originในการกำหนดค่า?

หากคุณ hardcode:

  1. คุณจะจบลงด้วยการoriginเป็นรีโมทใน repos ทั้งหมด ดังนั้นคุณจะไม่สามารถที่จะเพิ่มแหล่งกำเนิด set-urlแต่คุณจำเป็นต้องใช้
  2. หากเครื่องมือสร้างรีโมตที่มีชื่อแตกต่างกันการพุชค่าทั้งหมดจะไม่มีผล จากนั้นคุณจะต้องเปลี่ยนชื่อรีโมต แต่การเปลี่ยนชื่อจะไม่ทำงานเพราะoriginมีอยู่แล้ว (จากจุดที่ 1) ให้จำ :)

การดึงมาได้รับการดูแลแล้วโดยคอมไพล์ที่ทันสมัย

ตามคำตอบของ Jakub Narębski:

ด้วยคอมไพล์ที่ทันสมัยคุณจะดึงสาขาทั้งหมด (เป็นสาขาการติดตามระยะไกลในเนมสเปซ refs / remotes / origin / *

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