ข้อผิดพลาดในการกด Git: ไม่สามารถยกเลิกการเชื่อมโยงเก่าได้ (ปฏิเสธสิทธิ์)


192

ในเซิร์ฟเวอร์ระยะไกลฉันมีการตั้งค่า hook post-receive เพื่อทำการเช็คเอาต์ git ของที่เก็บของฉัน:

#!/bin/sh
GIT_WORK_TREE=/var/www/<website> git checkout -f

แต่เมื่อฉันกดจากเครื่องในพื้นที่ของฉันไปยังที่เก็บ git ในเซิร์ฟเวอร์ฉันได้รับข้อความแสดงข้อผิดพลาดต่อไปนี้:

remote: error: unable to unlink old '<file>' (Permission denied)

ปรากฏขึ้นหลายครั้งข้อความแสดงข้อผิดพลาดเดียวสำหรับเกือบทุกไฟล์

อย่างไรก็ตามฉันมีไฟล์ README.txt ที่ฉันสามารถเปลี่ยนได้โดยใช้ git นี่คือการอนุญาต:

-rw-r--r--  1 <serverusername>  <serverusername>  2939 Aug  2 10:58 README.txt

แต่ไฟล์อื่น ๆ ที่มีเจ้าของเดียวกันและสิทธิ์เหมือนกันให้ข้อผิดพลาดนั้นกับฉัน

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

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

คำตอบ:


336

เมื่อคุณต้องยกเลิกการเชื่อมโยงไฟล์คุณจะต้องมีสิทธิ์ 'w' สำหรับไดเรกทอรีซึ่งเป็นไฟล์ไม่ใช่ไฟล์ ...


65
แน่นอนว่าเป็นปัญหาฉันแก้ไขโดยใช้sudo chmod -R g+wโฟลเดอร์ที่มีความผิด
rfc1484

1
ขอบคุณ OMG รำคาญมากกับสิทธิ์คิดถูกต้องในไฟล์ ทำให้รู้สึกว่าการอัปเดตนั้นเหมือนmvการกระทำมากกว่าแค่เขียนทับ
doublejosh

1
การเปลี่ยนการอนุญาต dir นั้นใช้งานได้สำหรับฉัน (ขอบคุณ!) แต่ก็แปลกเพราะฉันสามารถเขียนทับไฟล์ที่เป็นปัญหาด้วยตนเองผ่าน sftp ได้โดยไม่มีปัญหา แปลกที่เมื่อคอมไพล์พยายามทำแบบเดียวกันมันก็ทำไม่ได้
Jonathan Stark

1
โปรดทราบว่าหากคุณยังมีไฟล์ที่เปิดอยู่ข้อผิดพลาดนี้จะปรากฏขึ้นเช่นกัน มีข้อผิดพลาดเดียวกันและนั่นเป็นสาเหตุที่ฉันไม่สามารถผลักดันการเปลี่ยนแปลงของฉันได้
Matias

1
อักขระตัวแรกของls -lจอแสดงผลระบุประเภทไฟล์และไม่เกี่ยวข้องกับการอนุญาต อักขระเก้าตัวที่เหลืออยู่ในชุดที่สามแต่ละคนแสดงถึงคลาสของสิทธิ์เป็นอักขระสามตัว ชุดแรกแทนคลาสผู้ใช้ ชุดที่สองแสดงถึงระดับกลุ่ม ชุดที่สามแสดงถึงคลาสอื่น ๆ g+wใน chmod ให้ชุดกลุ่ม (คนgพารามิเตอร์) ได้รับอนุญาตให้เขียน (คนwพารามิเตอร์)
rfc1484


42

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


13

ฉันมีปัญหาเดียวกันและไม่มีวิธีแก้ไขปัญหาใดที่ได้ผลสำหรับฉัน ฉันลบโฟลเดอร์ที่ละเมิด แล้ว:

git reset --hard

ลบไฟล์ lingering ใด ๆ เพื่อล้างสถานะ git จากนั้น:

git pull

ในที่สุดมันก็ใช้งานได้

หมายเหตุ: หากโฟลเดอร์นั้นเป็นโฟลเดอร์สาธารณะที่มีไฟล์บิลด์โปรดอย่าลืมสร้างไฟล์ใหม่


ขอบคุณไม่มีอะไรได้ผลสำหรับฉันเช่นกันการลบมันดูเหมือนจะเป็นตัวเลือกเดียว
math0ne

ในกรณีของฉันโฟลเดอร์ที่ละเมิดนั้นเป็น. git
Tushar Kathuria

13

ฉันคิดว่าปัญหาอาจเกิดจากความเป็นเจ้าของในโฟลเดอร์ดังนั้นตั้งเป็นความเป็นเจ้าของผู้ใช้ปัจจุบัน

sudo chown -R your_login_name /path/to/folder
คุณสามารถหาวิธีแก้ปัญหา [ที่นี่] [1]

8

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


ในทำนองเดียวกันฉันได้รับข้อผิดพลาดนี้เมื่อไฟล์ CSV ที่ควบคุมเวอร์ชันเปิดอยู่ใน Excel เพียงปิด Excel แก้ไขมัน นี่อาจเป็นจริงของแอปพลิเคชันอื่น ๆ เช่นกันบน windows และอาจขึ้นอยู่กับว่าโปรแกรมทำเครื่องหมายไฟล์ว่าเปิดในระหว่างการแก้ไขอย่างไร
Carel

4

นี่เป็นคำถามเก่า แต่อาจช่วยผู้ใช้ Mac ได้

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

ตัวอย่างเช่นส่วนในบทความนี้ที่ระบุว่า "วิธีแก้ไขการอนุญาตไฟล์ Mac OS X" แสดงให้เห็นว่า "ทุกคน" มีการอนุญาตที่กำหนดเองซึ่งทำให้ทุกอย่างยุ่งเหยิง:

สิทธิ์ที่ไม่เหมาะสมจาก http://dreamlight.com/how-to-fix-mac-os-x-file-permissions

คุณต้องลบ ACLs ออกจากไดเร็กทอรี / ไฟล์เหล่านั้น คำตอบผู้ใช้ขั้นสูงนี้จะเข้าสู่มัน แต่นี่คือคำสั่ง:

sudo chmod -RN .

จากนั้นคุณสามารถตรวจสอบให้แน่ใจว่าไดเรกทอรีและไฟล์ของคุณมีสิทธิ์ที่เหมาะสม ฉันใช้750สำหรับไดเรกทอรีและ644สำหรับไฟล์


3

ฉันได้รับข้อผิดพลาดนี้และข้อผิดพลาดคอมไพล์แปลก ๆ เมื่อฉันมีเซิร์ฟเวอร์ที่ทำงานอยู่ (ใน Intellij) การหยุดเซิร์ฟเวอร์และลองคำสั่ง git ซ้ำจะแก้ไขให้ฉันบ่อยๆ


3
git reset --hard

ทำงานให้ฉัน


4
นั่นอาจจะสุดเหวี่ยงนิดหน่อยเพราะมันมีประโยชน์มากกว่า
cdaddr


2

การดึงอาจสร้างการเปลี่ยนแปลงในท้องถิ่น

เพิ่มไฟล์ที่ไม่ได้ติดตามของคุณ:

คอมไพล์เพิ่ม

การเปลี่ยนแปลงที่ซ่อน

คอมไพล์สะสม

วางการเปลี่ยนแปลงในเครื่อง

git stash drop

ดึงด้วยสิทธิ์ sudo

sudo git ดึงสาขาจากระยะไกล


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

นี่เป็นสิ่งเดียวที่ฉันจะได้ผล
Eric

2

บางไฟล์มีการป้องกันการเขียนที่แม้แต่คอมไพล์ก็ไม่สามารถเขียนทับได้ เปลี่ยนการอนุญาตของโฟลเดอร์เพื่ออนุญาตการเขียนเช่น sudo chmod 775 foldername

จากนั้นดำเนินการ

git pull 

อีกครั้ง


1

นอกจากนี้อย่าลืมตรวจสอบการอนุญาตของไดเรกทอรีรากเอง!

คุณอาจพบ:

drwxr-xr-x  9 not-you www-data  4096 Aug  8 16:36 ./
-rw-r--r--  1     you www-data  3012 Aug  8 16:36 README.txt
-rw-r--r--  1     you www-data  3012 Aug  8 16:36 UPDATE.txt

และข้อผิดพลาด 'การปฏิเสธสิทธิ์' จะปรากฏขึ้น

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