ข้อผิดพลาด Git: ไม่สามารถต่อท้าย. git / logs / refs / remotes / origin / master: Permission ถูกปฏิเสธ


87

ฉันมีปัญหาแปลก ๆ ที่ดูเหมือนจะแก้ไขไม่ได้ นี่คือสิ่งที่เกิดขึ้น:

ฉันมีไฟล์บันทึกบางไฟล์ในที่เก็บ github ซึ่งฉันไม่ต้องการที่นั่น ฉันพบสคริปต์นี้ที่ลบไฟล์ทั้งหมดออกจากประวัติคอมไพล์ดังนี้:

    #!/bin/bash
set -o errexit

# Author: David Underhill
# Script to permanently delete files/folders from your git repository.  To use 
# it, cd to your repository's root and then run the script with a list of paths
# you want to delete, e.g., git-delete-history path1 path2

if [ $# -eq 0 ]; then
    exit 0are still
fi

# make sure we're at the root of git repo
if [ ! -d .git ]; then
    echo "Error: must run this script from the root of a git repository"
    exit 1
fi

# remove all paths passed as arguments from the history of the repo
files=$@
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch $files" HEAD

# remove the temporary history git-filter-branch otherwise leaves behind for a long time
rm -rf .git/refs/original/ && git reflog expire --all &&  git gc --aggressive --prune

แน่นอนฉันได้ทำการสำรองข้อมูลก่อนแล้วจึงลองใช้ ดูเหมือนว่ามันจะทำงานได้ดี. จากนั้นฉันก็ทำการ git push -f และได้รับการต้อนรับด้วยข้อความต่อไปนี้:

error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied
error: Cannot update the ref 'refs/remotes/origin/master'.

ดูเหมือนว่าทุกอย่างจะดำเนินไปได้ด้วยดีเพราะดูเหมือนว่าไฟล์จะหายไปจากที่เก็บ GitHub ถ้าฉันพยายามผลักดันอีกครั้งฉันจะได้รับสิ่งเดียวกัน:

error: Unable to append to .git/logs/refs/remotes/origin/master: Permission denied
error: Cannot update the ref 'refs/remotes/origin/master'.
Everything up-to-date

แก้ไข

$ sudo chgrp {user} .git/logs/refs/remotes/origin/master
$ sudo chown {user} .git/logs/refs/remotes/origin/master
$ git push
Everything up-to-date

ขอบคุณ!

แก้ไข

เอ่อโอ้. ปัญหา. ฉันทำงานในโครงการนี้มาตลอดทั้งคืนและเพิ่งจะทำการเปลี่ยนแปลง:

error: Unable to append to .git/logs/refs/heads/master: Permission denied
fatal: cannot update HEAD ref

ดังนั้นฉัน:

sudo chown {user} .git/logs/refs/heads/master
sudo chgrp {user} .git/logs/refs/heads/master

ฉันลองกระทำอีกครั้งและได้รับ:

error: Unable to append to .git/logs/HEAD: Permission denied
fatal: cannot update HEAD ref

ดังนั้นฉัน:

sudo chown {user} .git/logs/HEAD
sudo chgrp {user} .git/logs/HEAD

จากนั้นฉันก็ลองกระทำอีกครั้ง:

16 files changed, 499 insertions(+), 284 deletions(-)
create mode 100644 logs/DBerrors.xsl
delete mode 100644 logs/emptyPHPerrors.php
create mode 100644 logs/trimXMLerrors.php
rewrite public/codeCore/Classes/php/DatabaseConnection.php (77%)
create mode 100644 public/codeSite/php/init.php
$ git push
Counting objects: 49, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (27/27), done.
Writing objects: 100% (27/27), 7.72 KiB, done.
Total 27 (delta 15), reused 0 (delta 0)
To git@github.com:IAmCorbin/MooKit.git
59da24e..68b6397  master -> master

ไชโย ฉันไปที่http://GitHub.comและตรวจสอบที่เก็บข้อมูลและการกระทำล่าสุดของฉันไม่พบที่ใด :: เกาหัว :: ก็เลยดันอีก:

Everything up-to-date

อืม ... ดูไม่เป็นเลย ฉันไม่เคยมีปัญหานี้มาก่อนนี่อาจเป็นปัญหากับ github หรือไม่? หรือฉันทำอะไรบางอย่างกับโครงการคอมไพล์ของฉัน

แก้ไข

ไม่เป็นไรฉันทำง่ายๆ:

git push origin master

และมันก็ทำได้ดี

คำตอบ:


219

ดูเหมือนว่าคุณรันคอมไพล์เป็น root ในเครื่องดังนั้นจึงเปลี่ยนการเป็นเจ้าของไฟล์บางไฟล์ที่ติดตามตำแหน่งของไฟล์ originสาขา

แก้ไขการเป็นเจ้าของไฟล์และคุณควรจะสบายดี:

# run this from the root of the git working tree
sudo chown -R "${USER:-$(id -un)}" .

1
คำสั่งนั้นใช้ได้ผลสำหรับฉัน ฉันเรียกใช้มันจากรากของโคลน ขอบคุณ @CharlesDuffy!
ariestav

4
@ Mr.Stranger เฉพาะในกรณีที่คุณมีค่า IFS และชื่อผู้ใช้ที่มีเหตุผล (ชื่อผู้ใช้ที่มีช่องว่างสามารถเกิดขึ้นได้เช่นใน cygwin) ปลอดภัยกว่าที่จะอ้าง: sudo chown -R "$USER" .และไม่ถือว่ามีสติ :)
Charles Duffy

@ Mr.Stranger ... ยังUSERไม่ได้รับการค้ำประกันโดยpubs.opengroup.org/onlinepubs/009695399/utilities/..."$(id -un)"ดังนั้นจึงอาจจะมีความปลอดภัยในการใช้งาน
Charles Duffy

มันบอกว่าผู้ใช้ของฉันis not in the sudoers file. This incident will be reported.- มีเคล็ดลับเกี่ยวกับสิ่งที่ฉันทำได้ไหม ขอบคุณ.
giovannipds

1
ไวยากรณ์ข้างต้นเป็นขยายตัวพารามิเตอร์ ; "${var:-default}"ขยายไปเป็นค่าของตัวแปร"$var", เว้นแต่defaultค่าที่ว่างเปล่าหรือไม่มีการตั้งค่าในกรณีที่มันหายไป ดังนั้นเราทั้งขยายไปหรือผลผลิตที่เกิดจากการทำงาน"$USER" id -un
Charles Duffy

4

ให้ความสำคัญกับสิ่งที่มันบ่น:

ข้อผิดพลาดที่ถูกปฏิเสธการอนุญาต: ไม่สามารถอัปเดต ref 'refs / remotes / origin / master' ได้

ก่อนทำการเปลี่ยนแปลงแบบเรียกซ้ำ / การเป็นเจ้าของ ข้ามไปยังไฟล์นั้นและแก้ไขการอนุญาตใด ๆ ที่ไม่ถูกต้อง

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


3
การแก้ไขไฟล์ที่เป็นของบุคคลอื่นนอกเหนือจากที่ผู้ใช้คาดว่าจะเป็นเจ้าของแผนผังซอร์สทั้งหมดทีละไฟล์เป็นการปรับปรุงจริงหรือ
Charles Duffy

2

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

$find . -user root

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

$sudo chown parineethat `find . -user root`

จากนั้นฉันก็สามารถพุชรหัสของฉันจากภายในเครื่องไปยังระยะไกลได้


sudo chown parineethat `find . -user root` ไม่น่าเชื่อถือ - ใช้ไม่ได้กับชื่อไฟล์ที่มีช่องว่าง sudo find . -user root -exec chown parineethat {} +แทน ดูBashPitfalls # 1สำหรับการสนทนาที่เกี่ยวข้อง
Charles Duffy

1

การดำเนินการนี้จะเปลี่ยนไฟล์และไดเร็กทอรี. git ทั้งหมดของคุณแบบวนซ้ำ (จากรูทเป็น 1,000) และแสดงรายการการเปลี่ยนแปลงทั้งหมดที่เกิดขึ้นในเทอร์มินัล

sudo chown -Rc $ UID .git /


0

ฉันได้ลองแก้ไขความเป็นเจ้าของ Git แล้ว แต่ก็ยังไม่ได้ผล

แต่ฉันสามารถแก้ไขได้โดยสร้างสาขาในพื้นที่โดยใช้ชื่ออื่นแล้วลบออก

จากนั้นฉันตรวจสอบชื่อสาขาเดิมอีกครั้งและใช้งานได้

TLDR;

ฉันไม่สามารถชำระเงิน `` staging / rc ''

ดังนั้นฉันจึงชำระเงินโดยใช้stagingแทนว่ารีโมตชี้ไปที่ `` staging / rc ''

และฉันลบมันและชำระเงินอีกครั้ง แต่คราวนี้ฉันใช้staging/rcเป็นชื่อสาขาในพื้นที่ของฉัน

ได้ผลและฉันไม่รู้ว่าทำไม


-16

โปรดให้สิทธิ์จากrootบัญชีด้านล่างก่อน

chmod -R 777 foldername

หลังจากนั้นให้รันคำสั่งคอมมิต


7
สิ่งนี้เป็นอันตรายอย่างยิ่ง - ทำให้บัญชีใด ๆ ในระบบรวมถึง daemon ที่ถูกบุกรุกโดยมีสิทธิ์ "ไม่มีใคร" เท่านั้นเขียนการเข้าถึงไฟล์ของคุณ ภูตระบบใช้ "ไม่มีใคร" (หรือบัญชีที่ไม่มีสิทธิ์อื่น ๆ ) สำหรับส่วนประกอบที่ไวต่อความปลอดภัยเนื่องจากบัญชีไม่มีใครไม่ควรทำอะไรที่เสี่ยงเกินไปแม้ว่าจะถูกบุกรุกก็ตาม การอนุญาตให้ผู้ใช้ทุกคนเข้าถึงไฟล์ของคุณได้แม้กระทั่งไม่มีใครเขียนเท่ากับว่าคุณกำลังทำให้มาตรการรักษาความปลอดภัยที่จำเป็นนั้นไร้ประโยชน์
Charles Duffy

1
หากด้วยเหตุผลบางประการที่คุณต้องการให้ไฟล์ของคุณเป็นเจ้าของโดยการรูทและสามารถเขียนได้โดยผู้ใช้ที่ไม่ใช่รูทเฉพาะวิธีที่ปลอดภัยในการทำเช่นนั้น (บนระบบที่ผู้ใช้แต่ละคนมีกลุ่มของตัวเองตามที่เป็นแนวทางปฏิบัติมาตรฐาน) คือchown -R root:user directoryและ จากนั้นchmod -R 775 directory(หรือ770หากบัญชีอื่นไม่ต้องการการเข้าถึงแบบอ่าน)
Charles Duffy

1
@JasonGlisson สิ่งที่ "ใช้งานได้" เพียงแค่สร้างช่องโหว่ด้านความปลอดภัยขนาดใหญ่น่าจะเป็นสิ่งที่ดีกว่าถ้าอยู่ไม่ได้
Charles Duffy

1
@JasonGlisson ในขณะที่เรากำลังให้คำแนะนำทั้งในฐานะและต่อชุมชนในฐานะสมาชิกของชุมชนนั้นคำแนะนำประเภทใดและคุณภาพที่เราให้คือธุรกิจของฉันมากเท่ากับของคนอื่น - และในฐานะคนที่ทำงานด้านความปลอดภัย , ฉันพร้อมที่จะแสดงความคิดเห็นในเรื่องนี้ ดูความคิดเห็นเริ่มต้นเรื่องผลกระทบ
Charles Duffy

1
@JasonGlisson, ... สำหรับสาเหตุที่คำแนะนำของฉันไม่ได้ผลสำหรับคุณฉันต้องดูรายละเอียด - บันทึกของคำสั่งทำงานตามลำดับพร้อมรับคำสั่งแสดงไดเร็กทอรีการทำงานปัจจุบันก่อนแต่ละรายการ ข้อความแสดงข้อผิดพลาดใด ๆ ฯลฯ - เพื่อแสดงความคิดเห็น; แต่สถานที่สำหรับการสนทนานั้นจะแนบมากับคำตอบที่คุณรายงานผลลัพธ์ที่ไม่ดีซึ่งตรงข้ามกับที่นี่
Charles Duffy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.