ทำไมฉันไม่สามารถผลักดันไปยังพื้นที่เก็บข้อมูลเปล่านี้ได้


283

คุณสามารถอธิบายสิ่งที่ผิดกับเวิร์กโฟลว์นี้ได้หรือไม่

$ git init --bare bare
Initialized empty Git repository in /work/fun/git_experiments/bare/
$ git clone bare alice
Cloning into alice...
done.
warning: You appear to have cloned an empty repository.
$ cd alice/
$ touch a
$ git add a
$ git commit -m "Added a"
[master (root-commit) 70d52d4] Added a
 0 files changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 a
$ git push
No refs in common and none specified; doing nothing.
Perhaps you should specify a branch such as 'master'.
fatal: The remote end hung up unexpectedly
error: failed to push some refs to '/work/fun/git_experiments/bare'

ไม่ได้git pushผลักดันไปยังพื้นที่เก็บข้อมูลที่ฉันโคลนจาก?


คุณไม่ควรระบุสาขาที่จะผลักดัน?
Rekin

3
ไม่หลังจากโคลน !!! หลังจากปัญหาได้รับการแก้ไขมันใช้งานได้ดีและไม่จำเป็นต้องระบุสาขา ... ในการชำระเงินครั้งแรกของที่เก็บที่ว่างเปล่าสิ่งนี้เกิดขึ้นซึ่งน่ารำคาญมาก ... พวกเขาควรแก้ไขปัญหานี้
Dean Hiller

หวังว่าโพสต์นี้จะเป็นประโยชน์กับใครบางคนเมื่อพยายามทำข้างบน - samranga.blogspot.com/2015/07/ …ข้อผิดพลาดในคำถามสามารถเกิดขึ้นได้แม้พยายามสร้างที่เก็บ BitBucket จากโครงการที่มีอยู่แล้วในพื้นที่
Samitha Chathuranga

คำตอบ:


483

ใช่ปัญหาคือไม่มีข้อผูกพันใน "เปล่า" นี่เป็นปัญหาของการคอมมิทครั้งแรกเท่านั้นถ้าคุณสร้าง repos ตามลำดับ (เปลือยอลิซ) ลองทำ:

git push --set-upstream origin master

สิ่งนี้จะต้องใช้ในครั้งแรกเท่านั้น หลังจากนั้นควรทำงานตามปกติ

ดังที่ Chris Johnsen ชี้ให้เห็นคุณจะไม่มีปัญหานี้ถ้า push.default ของคุณถูกกำหนดเอง ฉันชอบอัปสตรีม / ติดตาม


1
ฉันทำsudo apt-get upgrade git-coreและsudo apt-get upgrade gitคิดว่าไม่จำเป็นต้องมีการอัปเดต git --versionผลตอบแทน 1.7.3.1 ความคิดใดที่ขาดหายไป ฉันยอมรับว่าในปัจจุบันapt-get updateใช้งานไม่ได้สำหรับฉัน แต่ไม่นานมานี้
ripper234

1
@ ripper234: เวอร์ชันปัจจุบันของ git คือ 1.7.5.3 คุณสามารถอยู่กับความไม่สะดวกใช้เวิร์กโฟลว์ที่แตกต่างกันหรือติดตั้ง git ล่าสุดด้วยตนเองโดยไม่ต้องบรรจุ debian / ubuntu
Seth Robertson

ใช่แล้วฉันลืมซอฟต์แวร์ที่ใช้เวลาก่อนที่จะได้รับการบรรจุ ฉันเป็น linux noob ที่มาจาก Windows และเคยคลิกที่นี่เพื่อติดตั้งเวอร์ชั่นใหม่ล่าสุด
ripper234

9
เกี่ยวกับ“รุ่นล่าสุดไม่ได้มีปัญหานี้” แม้จะอยู่ในรุ่นที่ผ่านมาเริ่มต้นสำหรับการผลักดันไม่ได้ดูเหมือนจะมีการเปลี่ยนแปลงจากmatching; คุณอาจpush.defaultตั้งค่าเป็นupstream/ tracking(หรือcurrent) ในของคุณ~/.gitconfig?
Chris Johnsen

4
พยายามgit push origin master:masterทำให้ชัดเจน หากยังใช้งานไม่ได้ให้ตรวจสอบเพื่อดูว่าคุณเปิดสาขาอะไรอยู่git branchบางทีคุณอาจยังไม่ได้ลงมือทำครั้งแรกหรือทำอย่างนั้นกับสาขาอื่นที่ไม่ใช่เจ้านาย
Seth Robertson

43

ถ้าคุณ:

 git push origin master

มันจะผลักไปที่ repo เปลือย

ดูเหมือนว่าธุรกรรมซื้อคืนอลิซของคุณไม่ถูกต้อง

cat .git/config

สิ่งนี้จะแสดงรีโมตและสาขาเริ่มต้น

ถ้าคุณ

 git push -u origin master

คุณควรเริ่มติดตามระยะไกลและสาขานั้น ฉันไม่แน่ใจว่าตัวเลือกนั้นอยู่ในระบบคอมไพล์หรือไม่


30

คำตอบของคำถามที่เกี่ยวข้องนี้ให้วิธีแก้ปัญหาสำหรับฉัน ... มันเป็นเพียงความผิดพลาดที่โง่เง่า:

อย่าลืมลงมือก่อน!

https://stackoverflow.com/a/7572252

หากคุณยังไม่ได้รับสัญญาซื้อคืนในพื้นที่ของคุณไม่มีสิ่งใดที่จะผลักดันได้ แต่ข้อความแสดงข้อผิดพลาด Git ที่คุณได้รับกลับไม่ได้ช่วยอะไรมาก


17
git push --all

เป็นวิธีที่ยอมรับได้ในการผลักทุกอย่างไปยังที่เก็บใหม่ที่เปลือยเปล่า

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

git clone --bare

จากนั้นใช้

git remote add origin <new-remote-repo>

ในที่เก็บ (ไม่ใช่เปลือย) ดั้งเดิม


... ดังนั้นคุณลงคะแนนคำตอบ? มันเป็นวิธีมาตรฐานในการผลักทุกอย่างไปยังที่เก็บใหม่ที่เปลือยเปล่า หากไม่ได้ผลสำหรับคุณมีปัญหาอื่น ๆ
ebneter

คุณพูดถูกฉันอาจไม่ควรรู้ว่าคุณแค่พยายามช่วย หากคุณแก้ไขฉันจะยกเลิกการลงคะแนนของฉัน
ripper234

ขอบคุณแก้ไขด้วยวิธีการอื่นเพื่อให้งานเดียวกันสำเร็จ
ebneter

คำตอบของคุณช่วยฉันขอบคุณ;) แต่ในตอนท้ายของคำสั่งเส้นทางต้องมีอยู่เช่นนี้: git push --all ../test_repoURL ของ repo ที่ส่วนท้ายของคำสั่ง;)
Metafaniel

@Metafaniel ขึ้นอยู่กับว่าคุณจะตั้งค่าอย่างไร หาก repo ในพื้นที่ของคุณมีการกำหนดค่ารีโมตอย่างเหมาะสมแล้ว "git push --all" ควรทำงานตามที่เป็นอยู่
ebneter

7

ลองสิ่งนี้ในที่aliceเก็บของคุณ(ก่อนกด):

git config push.default tracking

git config --global …หรือกำหนดค่าเป็นค่าเริ่มต้นสำหรับผู้ใช้ของคุณด้วย


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

push.defaultตัวแปรกำหนดค่า (ดูGit-config (1) ) การควบคุมสิ่งที่git pushจะผลักดันเมื่อมันไม่ได้รับการขัดแย้งใด ๆ “refspec” (บางสิ่งบางอย่างคือหลังจากชื่อพื้นที่เก็บข้อมูล) ค่าเริ่มต้นจะให้พฤติกรรมตามที่อธิบายไว้ข้างต้น

นี่คือค่าที่เป็นไปได้สำหรับpush.default:

  • nothing
    สิ่งนี้บังคับให้คุณจัดหา“ ผู้ชี้ขาด”

  • matching(ค่าเริ่มต้น)
    สิ่งนี้จะผลักดันกิ่งไม้ทั้งหมดที่มีอยู่ในแหล่งเก็บข้อมูลต้นทางและที่เก็บปลายทาง
    สิ่งนี้เป็นอิสระอย่างสมบูรณ์จากสาขาที่เช็คเอาท์

  • upstreamหรือtracking
    (ค่าทั้งสองมีความหมายเหมือนกันในภายหลังถูกคัดค้านเพื่อหลีกเลี่ยงความสับสนกับสาขา "การติดตามระยะไกล" อดีตถูกนำมาใช้ใน 1.7.4.2 ดังนั้นคุณจะต้องใช้หลังถ้าคุณใช้ Git 1.7.3.1 )
    เหล่านี้ผลักสาขาปัจจุบันไปยังสาขาที่ระบุโดยการกำหนดค่า“ upstream”

  • current
    สิ่งนี้จะพุชสาขาปัจจุบันไปยังสาขาที่มีชื่อเดียวกันที่ที่เก็บปลายทาง

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

    git checkout master
    # hack, commit, hack, commit
    
    # bug report comes in, we want a fix on master without the above commits
    
    git checkout -b quickfix origin/master  # "upstream" is master on origin
    # fix, commit
    git push
    

    ด้วยpush.defaultเท่ากับupstream(หรือtracking) การผลักดันจะไปorigin's ต้นแบบสาขา เมื่อมันมีค่าเท่ากับcurrentผลักดันจะไปorigin's QuickFIXสาขา

matchingการตั้งค่าจะอัปเดตbareเป็นหลักในสถานการณ์ของคุณหลังจากที่ได้รับการจัดตั้งขึ้น เพื่อสร้างมันคุณสามารถใช้git push origin masterครั้งเดียว

อย่างไรก็ตามการupstreamตั้งค่า (หรืออาจcurrent) ดูเหมือนว่าอาจเป็นการจับคู่ที่ดีกว่าสำหรับสิ่งที่คุณคาดว่าจะเกิดขึ้นดังนั้นคุณอาจต้องการลอง:

# try it once (in Git 1.7.2 and later)
git -c push.default=upstream push

# configure it for only this repository
git config push.default upstream

# configure it for all repositories that do not override it themselves
git config --global push.default upstream

(อีกครั้งถ้าคุณยังใช้ Git ก่อน 1.7.4.2 คุณจะต้องใช้trackingแทนupstream)


1

ฉันใช้ไคลเอนต์ git SourceTreeและฉันเห็นว่าคำสั่ง commit / push เริ่มต้นของพวกเขาคือ:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v --tags --set-upstream origin master:master
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.