การเปลี่ยนค่าเริ่มต้น 'push' เป็น Git จากระยะไกล


228

ฉันต้องการเปลี่ยนปลายทางสาขาระยะไกลเริ่มต้นของ Git เพื่อให้ฉันทำได้

git push

แทน:

git push upstream

ขณะนี้มีการตั้งค่าเป็นรีโมทแบบรีโมทและฉันต้องการตั้งค่าเป็นรีโมตอื่น

ฉันพยายามลบรีโมตดั้งเดิม (โคลนจาก)

git remote rm origin

ซึ่งลบรีโมตดั้งเดิมออก แต่ไม่ได้แก้git pushปัญหา ฉันยังรับ:

ร้ายแรง: ไม่มีปลายทางการกำหนดค่าการพุช ระบุ URL จาก
บรรทัดคำสั่งหรือกำหนดค่าที่เก็บระยะไกลโดยใช้ ...

ฉันพยายามเล่นด้วย:

git remote set-url --push myfork origin

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

ทำตามคำตอบที่นี่ฉันพยายามเปลี่ยน:

git config push.default upstream (or matching)

แต่ก็ไม่ได้ผล

คำตอบ:


215

คุณสามารถใช้git push -u <remote_name> <local_branch_name>เพื่อตั้งค่าเริ่มต้นต้นน้ำ ดูเอกสารประกอบสำหรับ git pushสำหรับรายละเอียดเพิ่มเติม


1
ใช้งานไม่ได้: ฉันได้รับ '' 'ถึงแก่ชีวิต:' ที่มา 'ดูเหมือนว่าจะไม่ได้เป็นที่เก็บของคอมไพล์ร้ายแรง: ปลายด้านไกลวางสายโดยไม่คาดคิด' '' อาจเป็นเพราะฉันลบต้นกำเนิดจากระยะไกลก่อนที่จะย้าย เพิ่งพบโซลูชันที่ใช้งานได้ฉันจะอัปเดตคำตอบ
alonisser

34
git push -u <remote_name> <local_branch_name>:<corresponding_remote_branch_name>ในฐานะที่เป็นคำชี้แจงเพิ่มเติมไวยากรณ์ที่ควรจะเป็น
Marco Lazzeri

33
ตัวอย่าง: git push -u origin master:master.
starbeamrainbowlabs

1
หลังจากตั้งค่ารีโมตเริ่มต้น ... ไม่มีอยู่แล้วที่คุณสามารถบังคับgit pushให้กดสาขารีโมตของสาขาโลคัลปัจจุบันได้หรือไม่? ฉันหมายถึงการทำเช่นนี้หมายความว่าฉันต้องเรียกใช้คำสั่งนี้สำหรับทุกสาขา ขวา? ฉันไม่สามารถทำการตั้งค่าเริ่มต้นสำหรับ repo ทั้งหมดได้หรือไม่ @MarcoLazzeri
ฮันนี่

2
@starbeamrainbowlabs ไม่git push -u origin masterเพียงพอหรือ คุณเป็นเพียงการแสดงไวยากรณ์เต็มหรือไม่
Josiah Yoder

108

ในการเปลี่ยนรีโมต upstream ใดที่เป็น "wired" ไปยังสาขาของคุณให้ใช้git branchคำสั่งด้วยแฟล็ก upstream configuration

ตรวจสอบให้แน่ใจว่ามีรีโมตอยู่ก่อน:

git remote -vv

ตั้งค่ารีโมตที่ต้องการสำหรับสาขา (เช็คเอาต์) ปัจจุบัน:

git branch --set-upstream-to <remote-name>

ตรวจสอบว่าสาขานั้นตั้งค่าด้วยรีโมตอัปสตรีมที่ถูกต้อง:

git branch -vv


2
เพิ่งลองgit branch --set-upstream-to myforkและได้รับข้อผิดพลาด:> ข้อผิดพลาด: ตัวเลือกที่ไม่รู้จัก `set-upstream-to 'ฉันใช้ git 1.7.9
alonisser

3
ไวยากรณ์มีการเปลี่ยนแปลงใน 1.8 ดูstackoverflow.com/questions/520650/…
jtniehof

1
ดูคำตอบต่อไปนี้: stackoverflow.com/a/2432799/1820106 ( git remote set-url origin PATH_TO_REMOTE)
Yinon Ehrlich

10
git branch -u <remotename>/<branch>ทำงานให้ฉัน คำสั่งถูกรันด้วยการตรวจสอบสาขาที่สนใจภายในเครื่อง ดู 'การติดตามสาขา' ในgit-scm.com/book/it/v2/Git-Branching-Remote-Branches
norio

2
คำสั่งระยะไกล verbose เอาท์พุทเป็นจริงเพียงหรือgit remote -v 'S v เสริมซ้ำซ้อน git remote --verbose-vv
Artif3x

45

ทำงานกับ Git 2.3.2 ...

git branch --set-upstream-to myfork/master

ตอนนี้status, pushและpullจะชี้ไปที่myforkระยะไกล


มันจะทำงานเมื่อคุณต้องการตั้งค่าเริ่มต้นpullด้วย
StingyJack

39

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

git push -u <remote_name> --all

14
เพียงแค่ต้องทราบสิ่งนี้จะผลักดันพวกเขาทั้งหมดเช่นเดียวกับการเปลี่ยนรีโมทอัปสตรีมของพวกเขา
poolie

16

หากคุณทำgit push origin -u localBranchName:remoteBranchNameตามgit pushคำสั่งและเรียงตามลำดับคุณจะได้รับข้อผิดพลาดที่ไม่มีต้นกำเนิดอยู่จากนั้นทำตามขั้นตอนเหล่านี้:

  1. git remote -v

ตรวจสอบว่ามีรีโมทที่ฉันไม่สนใจหรือไม่ ลบด้วยgit remote remove 'name'

  1. git config --edit

มองหาสัญญาณที่เป็นไปได้ของรีโมทเก่า / ไม่มีอยู่ มองหาpushdefault:

[remote]
  pushdefault = oldremote

อัปเดตoldremoteค่าและบันทึก

git push ควรทำงานตอนนี้


2
ขอบคุณ! ฉันมักจะเพิ่ม-uเมื่อใช้git pushกับรีโมตอื่นเนื่องจากหน่วยความจำของกล้ามเนื้อ สิ่งนี้ทำให้รีโมตที่กำหนดเป็นค่าเริ่มต้นตั้งค่ากลับมาใช้git config --edit(หรือกดอีกครั้งและตั้งค่ารีโมตใหม่) แก้ปัญหาได้
Tim Visée

13

เพียงแค่การชี้แจง (ใช้ git รุ่น 1.7.9.5 บน Ubuntu 12.04):

Git จะเพิ่ม / ลบรีโมท นี่คืออินสแตนซ์ระยะไกลของ git ที่มีเซิร์ฟเวอร์แนบอยู่

git remote add myremote git://remoteurl

จากนั้นคุณสามารถดึงที่เก็บ git ที่กล่าวไว้ดังนี้:

git fetch myremote

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

ก่อนอื่นให้ตรวจสอบว่าคุณมีปัญหานี้หรือไม่

git config -l | grep myremote

คุณควรเห็นบางสิ่งเช่น:

remote.myremote.url=git://remoteurl
remote.myremote.fetch=+refs/heads/*:refs/remotes/myremote/*
branch.myremote.remote=.
branch.myremote.merge=refs/heads/master

หากคุณเห็นbranch.myremote.remote=.คุณควรดำเนินการต่อไป:

git config branch.myremote.remote myremote
git checkout myremote
git pull

ตอนนี้คุณควรทันสมัยกับที่เก็บรีโมตและการดึง / การกดของคุณควรเชื่อมโยงกับรีโมตที่เหมาะสม คุณสามารถสลับรีโมทในลักษณะนี้ต่อสาขา [หมายเหตุ] [1]

ตามเอกสารการกำหนดค่าGit อย่างเป็นทางการคุณสามารถตั้งค่าสาขาการกดเริ่มต้น (เพียงค้นหา remote.pushdefault บนหน้านั้น) อย่างไรก็ตามโปรดทราบว่าสิ่งนี้จะไม่ส่งผลกระทบต่อที่เก็บ / สาขาที่มีอยู่แล้วดังนั้นสิ่งนี้จะใช้ได้ แต่ สำหรับที่เก็บใหม่ / สาขา คุณควรจำไว้ว่า--globalจะตั้งค่าเริ่มต้นที่เก็บข้อมูลเฉพาะของผู้ใช้ (~ / .gitconfig) --systemจะตั้งค่าเริ่มต้นที่เก็บข้อมูลทั่วทั้งระบบ (/ etc / gitconfig) และจะไม่มีการตั้งค่าตัวเลือกการตั้งค่าสำหรับที่เก็บปัจจุบัน (./.gitconfig)

นอกจากนี้ควรสังเกตว่าตัวเลือกการกำหนดค่าpush.defaultนั้นใช้สำหรับการกำหนดค่าลักษณะการทำงานแบบอ้างอิงไม่ใช่ พฤติกรรมระยะไกล

[1]: git branch --set-upstream myotherremoteมักจะทำงานที่นี่ แต่คอมไพล์จะบ่นว่ามันจะไม่ตั้งสาขาเป็นรีโมตของตัวเองหากgit branch --set-upstream myremoteมีการใช้งาน ฉันเชื่อว่านี่เป็นพฤติกรรมที่ไม่ถูกต้อง


แทนที่จะใช้git config -l | grep myremoteคุณสามารถใช้:git config --get branch.myremote.remote
Murmel

@Murmel แรกนี่คือ wiki ชุมชนดังนั้นอย่าลังเลที่จะปรับปรุงประการที่สอง--getถือว่าพฤติกรรมโดยเฉพาะฉันทำหมายเหตุว่ามีวิธีอื่น ๆ ในการตั้งค่า upstreams แต่นี่เป็นวิธีการหาข้อมูลโดยไม่ต้องพึ่งพาเครื่องมือคอมไพล์ให้เป็น แก้ไข. Git นั้นไม่สมบูรณ์แบบดีกว่าที่จะเข้าใจข้อมูลสิ่งที่มันทำและหวังว่าการเรียกใช้มันจะทำงานอย่างเหมาะสม
ตรวจสอบ

10

มันอาจจะมีประโยชน์ในการดูที่.git/configrepo ของคุณมันจะแสดงรายการรีโมตทั้งหมดและรีโมตดีฟอลต์สำหรับแต่ละสาขา

เช่น.

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@gitea.xxx.be:fii/web2016.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "bugfix/#8302"]
    remote = origin
    merge = "refs/heads/bugfix/#8302"
[branch "feature/#8331"]
    remote = origin
    merge = "refs/heads/feature/#8331"
[remote "scm"]
    url = https://scm.xxx.be/git/web2016bs.git
    fetch = +refs/heads/*:refs/remotes/scm/*

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

  • ให้ความสนใจ! เมื่อเปลี่ยนหรือลบรีโมทให้แน่ใจว่าได้อัปเดตข้อมูลอ้างอิงทั้งหมดในไฟล์ปรับแต่งนี้

5

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

git config remote.origin.url url-to-my-other-remote

5
นี่ไม่ใช่วิธีแก้ปัญหาที่ดีผู้ใช้ git ควรสามารถดึง / ดันจากที่เก็บหลายแห่ง - แม้ว่าสิ่งนี้จะช่วยให้คุณเปลี่ยนรีโมตของต้นฉบับได้ แต่ก็ไม่ได้หมายความว่าคุณควรเปลี่ยนรีโมตดั้งเดิมเนื่องจากนี่น่าจะหมายความว่า คือจำนวนความไม่ลงรอยกันระหว่างรีโมต การผสานจะช่วยที่นี่ แต่มันง่ายขึ้นและเก็บรักษาประวัติเพิ่มเติมเพื่อตั้งค่ารีโมตในสาขาใหม่
smaudet

ไม่ใช่วิธีการที่ถูกต้องในการทำ ... @ คำตอบของ Jordan มีประโยชน์มากกว่า
Raja Anbazhagan

1
ดูเพิ่มเติมที่: stackoverflow.com/a/2432799/1820106 ( git remote set-url origin PATH_TO_REMOTE)
Yinon Ehrlich

5

เรียบง่ายมากและนำเสนอความคิดเห็นที่ยอดเยี่ยมที่นี่พร้อมกับงานวิจัยของฉันเกี่ยวกับเรื่องนี้

ขั้นแรกให้ตรวจสอบสาขาท้องถิ่นที่คุณต้องการผูกสาขาระยะไกลของคุณ:

git checkout mybranch

ต่อไป:

git branch -u origin/mybranch

ที่อยู่:

git branch -u {remote name}/{branch name}

คุณควรได้รับข้อความ:

"Branch mybranch set up to track remote branch mybranch from origin."

3

ในกรณีของฉันฉันแก้ไขโดยต่อไปนี้: * run git config --edit * ในไฟล์ git config:

[branch "master"]
remote = origin # <--- change the default origin here

0

git remote set-url --push origin ควรใช้งานได้ตามที่คุณกล่าวถึง แต่คุณต้องระบุ URL อย่างชัดเจนแทนที่จะใช้ชื่อรีโมตสำรองเช่น

git remote set-url --push origin git@github.com:contributor/repo.git

git remote -vคุณสามารถยืนยันว่านี้ทำงานโดยการทำ เช่น

λ ~/go/src/github.com/stretchr/testify/ master git remote -v
fork    git@github.com:contributor/testify.git (fetch)
fork    git@github.com:contributor/testify.git (push)
origin  git@github.com:stretchr/testify (fetch)
origin  git@github.com:contributor/testify.git (push)
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.