ข้อผิดพลาด Git Push: ปฏิเสธที่จะอัปเดตสาขาเช็คเอาต์


197

ฉันได้แก้ไขข้อขัดแย้งในการรวมแล้วพยายามส่งการเปลี่ยนแปลงของฉันและได้รับข้อผิดพลาดต่อไปนี้:

c:\Program Files (x86)\Git\bin\git.exe push --recurse-submodules=check "origin" master:master
Done
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error: 
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless you
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error: 
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To C:/Development/GIT_Repo/Project
 ! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'C:/Development/GIT_Repo/Project'

ไม่มีใครรู้ว่าสิ่งที่อาจทำให้เกิดข้อผิดพลาดนี้?



6
ตอนนี้คุณมีวิธีที่ปลอดภัยในการผลักดันไปยัง repo ที่ไม่ได้เปลือยด้วย Git 2.3.0 (กุมภาพันธ์ 2015) และgit config receive.denyCurrentBranch=updateInstead: stackoverflow.com/a/28262104/6309
VonC

คำตอบ:


229

เหตุผล: คุณกำลังผลักดันไปยังพื้นที่เก็บข้อมูลที่ไม่ใช่เปลือย

ที่เก็บมีสองประเภทคือเปลือยและไม่เปลือย

ที่เก็บเปลือยไม่มีสำเนาที่ใช้งานได้และคุณสามารถพุชให้ได้ นี่คือประเภทของที่เก็บที่คุณได้รับใน Github! หากคุณต้องการสร้างพื้นที่เก็บข้อมูลเปลือยคุณสามารถใช้

git init --bare

ดังนั้นในระยะสั้นคุณไม่สามารถผลักดันไปยังพื้นที่เก็บข้อมูลที่ไม่ได้เปลือย(แก้ไข: คุณไม่สามารถผลักดันไปยังสาขาที่เช็คเอาต์ในปัจจุบันของที่เก็บได้ด้วยที่เก็บเปลือยคุณสามารถกดไปที่สาขาใดก็ได้เนื่องจากไม่มีการเช็กเอาต์แม้ว่าจะเป็นไปได้ก็ตาม . สิ่งที่คุณสามารถทำได้คือการดึงและผสานจากพื้นที่เก็บข้อมูลอื่น นี่คือสิ่งpull requestที่คุณเห็นใน Github คุณขอให้พวกเขาดึงออกมาจากคุณและคุณไม่ได้บังคับให้พวกเขา


ปรับปรุง : ขอบคุณที่ VonC สำหรับการชี้ออกมานี้ในรุ่นล่าสุดคอมไพล์ (ปัจจุบัน 2.3.0) การผลักดันไปสู่การตรวจสอบออกสาขาของพื้นที่เก็บข้อมูลที่ไม่ได้เปลือยเป็นไปได้ อย่างไรก็ตามคุณยังไม่สามารถผลักต้นไม้สกปรกที่ไม่ปลอดภัยได้


1
ใช่ ถูกต้องแล้วขอบคุณ! เนื่องจากฉันมีสิ่งที่ต้องทำมากกว่าหนึ่งล้านฉันจึงโคลนไดเรกทอรีการทำงานโดยไม่ตั้งใจ .... doh!
Funky

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

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

8
ตอนนี้คุณมีวิธีที่ปลอดภัยในการผลักดันไปยัง repo ที่ไม่ได้เปลือยด้วย Git 2.3.0 (กุมภาพันธ์ 2015) และgit config receive.denyCurrentBranch=updateInstead: stackoverflow.com/a/28262104/6309
VonC

1
@skelly โคลนของคุณไม่ได้เปลือยเปล่าในขณะที่สำเนาบน github ดังนั้นในขณะที่โคลนทั้งสองมีประวัติทั้งหมดสำเนาบน Github ไม่มีการกระทำใด ๆ ที่ตรวจสอบ แต่สำเนาของคุณทำเพื่อให้คุณทำงาน!
Shahbaz

115

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

$ git config --bool core.bare true

หลังจากนั้นก็ใช้งานได้ดี


3
นี่คือการแก้ไขหนึ่งซับผมกำลังมองหา .. แต่อาจจะอธิบาย Repos ไม่ใช่เปลือยเปล่าเช่นคำตอบ @shahbaz
Mr5o1

สิ่งนี้จะช่วยผลักดันประวัติการเปลี่ยนแปลง แต่การเปลี่ยนแปลงเหล่านั้นจะไม่ปรากฏใน repo ที่ไม่ได้เปลือย
jhill515

คุณจะgit config core.bare falseและgit reset --hard ?
เครื่องบิน

1
ดังกล่าวข้างต้นระยะไกลจะไม่ถูกแก้ไขเมื่อคุณผลักดันมัน
user1097111

46

สรุป

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

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

การชันสูตรปัญหา

เมื่อสาขาถูกเช็กเอาต์การคอมมิตจะเพิ่มการคอมมิตใหม่กับส่วนหัวสาขาปัจจุบันเป็นพาเรนต์และย้ายส่วนหัวของสาขาไปเป็นการคอมมิชชันใหม่

ดังนั้น

A ← B
    ↑
[HEAD,branch1]

กลายเป็น

A ← B ← C
        ↑
    [HEAD,branch1]

แต่ถ้ามีใครบางคนสามารถกดไปที่สาขานั้นในระหว่างนั้นผู้ใช้จะได้รับสิ่งที่เรียก git เรียกโหมดหัวเดี่ยว :

A ← B ← X
    ↑   ↑
[HEAD] [branch1]

ตอนนี้ผู้ใช้ไม่ได้อยู่ใน branch1 อีกต่อไปโดยไม่ต้องขอให้ตรวจสอบสาขาอื่นอย่างชัดเจน แย่กว่านั้นผู้ใช้อยู่นอกสาขาใด ๆ และการกระทำใหม่ใด ๆ ก็จะห้อยต่องแต่ง :

      [HEAD]
        ↓
        C
      ↙
A ← B ← X
        ↑
       [branch1]

สมมุติฐานถ้าที่จุดนี้จะตรวจสอบผู้ใช้ออกจากสาขาอื่นแล้วห้อยนี้กระทำจะกลายเป็นเกมที่ยุติธรรมสำหรับ Git ของการเก็บขยะ



22

สำหรับฉันแล้วสิ่งต่อไปนี้เป็นการหลอกลวง:

git config --global receive.denyCurrentBranch updateInstead

ฉันตั้งค่าไดรฟ์ F: เกือบทั้งหมดเพื่อซิงค์ระหว่างเดสก์ท็อป Windows 10 และแล็ปท็อป Windows 10 ของฉันโดยใช้ Git ฉันลงเอยด้วยการรันคำสั่งด้านบนทั้งสองเครื่อง

ก่อนอื่นฉันแบ่งปันไดรฟ์ F ของเดสก์ท็อปบนเครือข่าย จากนั้นฉันก็สามารถโคลนมันบนแล็ปท็อปของฉันโดยการเรียกใช้:

F: git clone 'file://///DESKTOP-PC/f'

น่าเสียดายที่ไฟล์ทั้งหมดจบลงที่ "F: \ f \" บนแล็ปท็อปของฉันไม่ใช่ภายใต้ F: \ โดยตรง แต่ฉันสามารถตัดและวางด้วยตนเองได้ Git ยังคงทำงานจากที่ตั้งใหม่ในภายหลัง

จากนั้นฉันก็ลองทำการเปลี่ยนแปลงบางอย่างกับไฟล์บนแล็ปท็อปยอมรับพวกเขาและผลักมันกลับไปที่เดสก์ท็อป ไม่ทำงานจนกว่าฉันจะรันคำสั่ง git config ที่กล่าวถึงข้างต้น

โปรดทราบว่าฉันใช้คำสั่งเหล่านี้ทั้งหมดจากใน Windows PowerShell บนเครื่องทั้งสอง

UPDATE: ฉันยังคงมีปัญหาในการผลักดันการเปลี่ยนแปลงในบางกรณี ในที่สุดฉันก็เริ่มดึงการเปลี่ยนแปลงแทนโดยการเรียกใช้สิ่งต่อไปนี้บนคอมพิวเตอร์ฉันต้องการดึงการส่งข้อความล่าสุดไปที่:

git pull --all --prune


1
ฉันชอบท้องถิ่นนี้กับ repo คอมไพล์:git config receive.denyCurrentBranch updateInstead
klor

21

cd เข้าไปใน repo / directory ที่คุณกดเข้าไปในเครื่องรีโมตและป้อน

$ git config core.bare true

สิ่งนี้ใช้ไม่ได้ ที่เก็บว่างเปล่าหลังจากกดเข้าไป
Sören

ดังที่ได้กล่าวไว้โดย jhil515 ข้างต้นไฟล์ที่ไม่ได้เปลือยจะไม่ได้รับการอัพเดตเฉพาะฐานข้อมูล
เดนิส Cousineau

14

เนื่องจากมีที่เก็บข้อมูลที่มีอยู่แล้วทำงานอยู่

git config --bool core.bare true

บนพื้นที่เก็บข้อมูลระยะไกลควรจะพอเพียง

จากเอกสาร core.bare

หากเป็นจริง (bare = true) พื้นที่เก็บข้อมูลจะถือว่าเป็นไฟล์ที่ไม่มีไดเรกทอรีที่ใช้งานได้ หากเป็นกรณีนี้คำสั่งจำนวนมากที่ต้องการไดเรกทอรีการทำงานจะถูกปิดใช้งานเช่น git-add หรือ git-merge (แต่คุณจะสามารถกดไปที่มัน)

การตั้งค่านี้จะถูกเดาโดยอัตโนมัติโดย git-clone หรือ git-init เมื่อสร้างที่เก็บ โดยค่าเริ่มต้นพื้นที่เก็บข้อมูลที่ลงท้ายด้วย "/.git" จะถือว่าไม่ได้รับการเปลือย (bare = false) ในขณะที่ที่เก็บอื่น ๆ ทั้งหมดจะถือว่าเป็นเปลือย (bare = true)


12

TLDR

  1. ดึงและดันอีกครั้ง: git pull &&& git push.
  2. ยังมีปัญหาอยู่เหรอ? ผลักดันเข้าสู่สาขาที่แตกต่าง: git push origin master:fooและรวมเข้ากับ repo ระยะไกล
  3. หรือบังคับให้กดโดยการเพิ่ม-f( denyCurrentBranchต้องละเว้น)

โดยทั่วไปข้อผิดพลาดหมายความว่าที่เก็บข้อมูลของคุณไม่ทันสมัยด้วยรหัสระยะไกล (ดัชนีและแผนผังการทำงานไม่สอดคล้องกับสิ่งที่คุณผลักดัน)

โดยปกติคุณควรpullจะได้รับการเปลี่ยนแปลงล่าสุดและpushอีกครั้ง

หากไม่ช่วยลองผลักสาขาต่าง ๆ เช่น:

git push origin master:foo

จากนั้นผสานสาขานี้ในที่เก็บระยะไกลกลับมาพร้อมกับต้นแบบ

หากคุณเปลี่ยนการกระทำบางอย่างที่ผ่านมากระทำโดยเจตนาผ่านgit rebaseและคุณต้องการแทนที่ repo ด้วยการเปลี่ยนแปลงของคุณคุณอาจต้องการบังคับให้กดโดยการเพิ่ม-f/ --forceพารามิเตอร์ (ไม่แนะนำถ้าคุณไม่ทำrebase) หากยังไม่สามารถใช้งานได้คุณต้องตั้งค่าreceive.denyCurrentBranchเป็นignoreรีโมตตามคำแนะนำของข้อความคอมไพล์ผ่าน:

git config receive.denyCurrentBranch ignore

3

บางที repo ระยะไกลของคุณอยู่ในสาขาที่คุณต้องการผลักดัน คุณสามารถลองชำระเงินสาขาอื่นในเครื่องระยะไกลของคุณ ฉันทำสิ่งนี้มากกว่าข้อผิดพลาดเหล่านี้หายไปและฉันผลักดันความสำเร็จให้กับ repo ระยะไกลของฉัน ขอให้สังเกตว่าฉันใช้ ssh เพื่อเชื่อมต่อเซิร์ฟเวอร์ของตัวเองแทน github.com


1

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


1
ในสถานการณ์ของฉันนี่เป็นกรณี การลบ.gitโฟลเดอร์บนรีโมทอนุญาตให้ฉันดันการส่งครั้งแรก
tim.rohrer

0

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


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