Git Push Error: สิทธิ์ไม่เพียงพอสำหรับการเพิ่มวัตถุไปยังฐานข้อมูลที่เก็บ


591

เมื่อฉันพยายามที่จะผลักดันไปยังรีโมทคอมไพล์ฉันได้รับข้อผิดพลาดดังต่อไปนี้: insufficient permission for adding an object to repository database

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


ฉันได้รับข้อผิดพลาดนี้หลังจากบังเอิญgit addและgit commitเป็นผู้ใช้รูท ฉันแก้ไขด้วยgit resetและคำตอบของคำถามนี้เพื่อแก้ไข.gitสิทธิ์ไดเรกทอรี
StockB

ฉันจะหาออกซึ่งวัตถุมันก็พยายามที่จะสร้าง (เมื่อตนเองแก้จุดบกพร่องปัญหาดังกล่าวได้รับอนุญาต)? ข้อความแสดงข้อผิดพลาดนั้นคลุมเครือเกินไป
mirabilos

ฉันพบข้อผิดพลาดนี้ในขณะที่คัดลอกการวางไฟล์. git อีกอันก่อนโดยใช้ sudo ดังนั้นไฟล์จึงมี sudo sudo เป็นชื่อและกลุ่ม
Vincent

คำตอบ:


864

สิทธิ์ในการซ่อม

หลังจากที่คุณระบุและแก้ไขสาเหตุที่สำคัญแล้ว (ดูด้านล่าง) คุณจะต้องแก้ไขการอนุญาต:

cd /path/to/repo.git
sudo chgrp -R groupname .
sudo chmod -R g+rwX .
find . -type d -exec chmod g+s '{}' +

หมายเหตุหากคุณต้องการให้ทุกคนสามารถแก้ไขที่เก็บได้คุณไม่ต้องการchgrpและคุณจะต้องเปลี่ยน chmod เป็นsudo chmod -R a+rwX .

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

สาเหตุที่สำคัญ

ข้อผิดพลาดอาจเกิดจากหนึ่งในสิ่งต่อไปนี้:

  • ที่เก็บข้อมูลไม่ได้รับการกำหนดค่าให้เป็นพื้นที่เก็บข้อมูลที่ใช้ร่วมกัน (ดูcore.sharedRepositoryในgit help config) หากการส่งออกของ:

    git config core.sharedRepository
    

    ไม่ใช่groupหรือtrueหรือ1หรือหน้ากากบางอันลองเรียกใช้:

    git config core.sharedRepository group
    

    จากนั้นเรียกใช้ recursive อีกครั้งchmodและchgrp(ดู "สิทธิ์การซ่อมแซม" ด้านบน)

  • ระบบปฏิบัติการไม่ตีความบิต setgid ในไดเรกทอรีเนื่องจาก "ไฟล์และไดเรกทอรีย่อยใหม่ทั้งหมดควรสืบทอดเจ้าของกลุ่ม"

    เมื่อcore.sharedRepositoryใดtrueหรือgroupGit อาศัยคุณลักษณะของระบบปฏิบัติการ GNU (เช่นการกระจาย Linux ทุกครั้ง) เพื่อให้แน่ใจว่าไดเรกทอรีย่อยที่สร้างขึ้นใหม่นั้นเป็นของกลุ่มที่ถูกต้อง (กลุ่มที่ผู้ใช้ที่เก็บทั้งหมดอยู่) คุณลักษณะนี้ได้รับการบันทึกไว้ในเอกสารประกอบ coreutils ของ GNU :

    ... [ถ้า] บิต set-group-ID ของไดเรกทอรีถูกตั้งค่าไฟล์ย่อยที่สร้างขึ้นใหม่จะสืบทอดกลุ่มเดียวกับไดเรกทอรีและไดเรกทอรีย่อยที่สร้างขึ้นใหม่จะสืบทอดบิต set-group-ID ของไดเรกทอรีหลัก ... [กลไกนี้ช่วยให้] ผู้ใช้แชร์ไฟล์ได้ง่ายขึ้นโดยลดความจำเป็นในการใช้chmodหรือchownแชร์ไฟล์ใหม่

    อย่างไรก็ตามระบบปฏิบัติการบางระบบอาจไม่มีคุณสมบัตินี้ (NetBSD เป็นตัวอย่างหนึ่ง) สำหรับระบบปฏิบัติการเหล่านั้นคุณควรตรวจสอบให้แน่ใจว่าผู้ใช้ Git ทั้งหมดของคุณมีกลุ่มเริ่มต้นเดียวกัน หรือคุณสามารถทำให้พื้นที่เก็บข้อมูลสามารถเขียนได้ทั่วโลกโดยการเรียกใช้git config core.sharedRepository world(แต่ต้องระวัง - นี่ปลอดภัยน้อยกว่า)

  • ระบบไฟล์ไม่รองรับบิต setgid (เช่น FAT) ext2, ext3, ext4 ทั้งหมดสนับสนุนบิต setgid เท่าที่ฉันรู้ระบบไฟล์ที่ไม่รองรับ setgid bit ก็ไม่สนับสนุนแนวคิดการเป็นเจ้าของกลุ่มดังนั้นไฟล์และไดเรกทอรีทั้งหมดจะเป็นของกลุ่มเดียวกันต่อไป (กลุ่มใดเป็นตัวเลือกเมานท์) ในกรณีนี้ตรวจสอบให้แน่ใจว่าผู้ใช้ Git ทั้งหมดอยู่ในกลุ่มที่เป็นเจ้าของไฟล์ทั้งหมดในระบบไฟล์
  • ไม่ใช่ผู้ใช้ Git ทั้งหมดที่อยู่ในกลุ่มเดียวกันที่เป็นเจ้าของไดเรกทอรีที่เก็บ ตรวจสอบให้แน่ใจว่าเจ้าของกลุ่มในไดเรกทอรีนั้นถูกต้องและผู้ใช้ทั้งหมดอยู่ในกลุ่มนั้น

1
@ Richard Hansen - ฉันไม่รู้จริงๆว่าคุณหมายถึงอะไรโดยการบังคับให้เจ้าของ ฉันกำลังดูชายคนนั้นสำหรับ chmod แต่ไม่รู้เกี่ยวกับเรื่องนี้มากพอที่จะมีคำพูดที่สมเหตุสมผล :)
skaz

7
@GiH: คุณจะไม่ได้อะไรเลยถ้ามันไม่ได้ตั้งไว้ (ซึ่งเหมือนกับfalseหรือumask) ดูgit help configรายละเอียดเพิ่มเติมได้ที่
Richard Hansen

10
ฉันต้องออกgit pushโดยใช้บัญชีรูทในไดเรกทอรีทำงานของฉัน ฉันพบว่าเจ้าของไฟล์ git repository เป็นroot ( -r--r--r--. 1 root root 6380 5月 25 12:39 9b44bd22f81b9a8d0a244fd16f7787a1b1d424) ตามคำตอบนี้
LiuYan 刘研

3
@MattBrowne: หมายเหตุว่ามันเป็นเงินทุนไม่ได้เป็นตัวพิมพ์เล็กX xตัวพิมพ์ใหญ่Xหมายถึง "ตั้งค่าS_IXGRPหากไฟล์เป็นไดเรกทอรี (หรือถ้าS_IX*บิตอื่นถูกตั้งค่าไว้)" ดังนั้นไฟล์จะไม่ทำให้ไฟล์ทั้งหมดทำงานได้ มันอาจไม่จำเป็น แต่อาจไม่ใช่ถ้าcore.sharedRepositoryตั้งไว้0600ที่จุดหนึ่งในอดีต
Richard Hansen

2
@francoisromain: บรรทัดนั้นตั้งบิต setgid ในไดเรกทอรีทั้งหมด ดูgnu.org/software/coreutils/manual/html_node/…
Richard Hansen

440

สำหรับ Ubuntu (หรือ Linux ใด ๆ )

จากโครงการราก

cd .git/objects
ls -al
sudo chown -R yourname:yourgroup *

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

หมายเหตุ: จำดวงดาวที่ท้ายบรรทัด sudo


7
ใช้งานได้ดีมาก! ใช่ด้วยเหตุผลบางประการโฟลเดอร์บางโฟลเดอร์ได้รับชื่อและกลุ่มที่แตกต่างกัน (รูท)
Peter Arandorenko

2
ฉันได้รับ:Sorry, user myuser is not allowed to execute '/bin/chown
Francisco Corrales Morales

*ทำให้ความแตกต่าง ขอบคุณ
Bradley Flood

5
ปัญหาของฉันคือฉันได้ทำครั้งเดียว "ดึง git" เป็นรากซึ่งฉันคิดว่าเมาขึ้นสิทธิ์ ... คุณสามารถตรวจสอบโดยการทำls .git
rogerdpack

ขอบคุณสำหรับการแก้ปัญหาอย่างรวดเร็ว!
helvete

74

ใช้คำสั่งดังต่อไปนี้ทำงานเหมือนเวทมนตร์

sudo chown -R "${USER:-$(id -un)}" .

พิมพ์คำสั่งให้ตรงตามที่เป็นอยู่ (มีช่องว่างเพิ่มเติมและหนึ่งจุดที่ท้าย)


6
ทำงานเหมือนจับใจ!
doncadavona

1
! น่ากลัว ทำงานได้อย่างสมบูรณ์แบบบนเครื่องแม็คของฉัน
Sachin Khot

สิ่งนี้ช่วยฉันด้วย! ขอบคุณ
Horvath Adam

แน่นอนทำงานเหมือนเวทมนตร์! ขอบคุณ!
Kumar Manish

49

sudo chmod -R ug+w .;

โดยทั่วไป.git/objectsไฟล์ไม่มีสิทธิ์ในการเขียน บรรทัดข้างต้นให้สิทธิ์ไฟล์และโฟลเดอร์ทั้งหมดในไดเรกทอรี


2
นี่คือสิ่งที่ได้ผลสำหรับฉัน คำตอบที่ยอมรับไม่ได้น่าเศร้า ขอบคุณราเชนท!
revelt

27

ฉันแค่ต้องการเพิ่มโซลูชันของฉัน ฉันมี repo บน OS X ที่มีความเป็นเจ้าของรูทในบางไดเรกทอรีและหน้าแรก (ซึ่งเป็นไดเรกทอรีผู้ใช้ของฉัน) ในรายการอื่นซึ่งทำให้เกิดข้อผิดพลาดเดียวกันข้างต้น

การแก้ปัญหานั้นง่ายมากขอบคุณ จากสถานี:

sudo chown -R Home projectdirectory

เกิดขึ้นกับฉันเหมือนกัน ฉันไม่สามารถทราบได้ว่าวัตถุบางชิ้นมีกรรมสิทธิ์ในการรูท แต่พวกเขาทำ
vy32

18

วิธีที่ดีในการแก้ปัญหานี้เป็นครั้งต่อไปมันเกิดขึ้น SSH เข้าไปใน repo ระยะไกล, CD ls -alเป็นวัตถุโฟลเดอร์และทำ

หากคุณเห็นไฟล์ 2-3 ไฟล์ที่มีผู้ใช้ต่างกัน: ความเป็นเจ้าของกลุ่มมากกว่านี้เป็นปัญหา

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

คุณควรเพิ่มบิตที่เหนียวในโฟลเดอร์เพื่อให้ไฟล์ทั้งหมดที่สร้างในโฟลเดอร์นั้นจะมีกลุ่มgitอยู่เสมอ

ชื่อไดเรกทอรี chmod g + s

อัปเดต: ฉันไม่รู้เกี่ยวกับ core.sharedRepository เป็นการดีที่จะรู้แม้ว่ามันอาจจะเป็นเพียงข้างต้น


15

แก้ไขให้ฉัน ... แค่นี้:

sudo chmod 777 -R .git/objects

21
Chmod 777ไม่แนะนำเพราะจะทำให้ไฟล์ทั้งหมดของคุณไปทั่วโลกทำให้เครื่องของคุณเสี่ยง
Elena

23
หากคำแนะนำของคุณchmod 77799 ครั้งจาก 100 คุณไม่เข้าใจปัญหาและคุณมีแนวโน้มที่จะทำให้เกิดปัญหามากกว่าที่คุณช่วยแก้ปัญหา ตามคำตอบที่ได้รับการยอมรับแสดงให้เห็นว่าปัญหานี้ไม่แตกต่างกัน
โจนาตัน

ทำไมพวกคุณถึงไม่เสนอคำตอบที่ยอมรับได้แทนที่จะพูดว่าเป็นตัวเลือกที่ผิด?
Giovani

2
เนื่องจากแม้ว่าจะมีคำตอบที่ยอมรับได้บนหน้าเว็บ แต่คำตอบที่ยอมรับไม่ได้ยังคงอยู่ที่นี่
Teh JoE

sudo chmod -R 777 .git / objects
Nabeel Ahmed

9

สิ่งนี้สามารถเกิดขึ้นได้อย่างง่ายดายหากคุณใช้งานgit initกับผู้ใช้คนอื่นจากคนที่คุณวางแผนจะใช้เมื่อทำการเปลี่ยนแปลง

หากคุณทำตามคำแนะนำใน [1] สุ่มสี่สุ่มห้าสิ่งนี้จะเกิดขึ้นเนื่องจากคุณอาจสร้างผู้ใช้ git เป็นรูทจากนั้นย้ายไปยัง git init ทันทีโดยไม่ต้องเปลี่ยนผู้ใช้ในระหว่างนั้น

[1] http://git-scm.com/book/en/Git-on-the-Server-Setting-Up-the-Server


7

Linux, macOS:

cd .git/
sudo chown -R name:group *

nameชื่อผู้ใช้ของคุณอยู่ที่ไหนและgroupเป็นกลุ่มที่ชื่อผู้ใช้ของคุณอยู่


5

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

$ git push
Counting objects: 31, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (17/17), done.
Writing objects: 100% (21/21), 2.07 KiB | 0 bytes/s, done.
Total 21 (delta 12), reused 0 (delta 0)
remote: error: insufficient permission for adding an object to repository database ./objects  remote: fatal: failed to write object

ในการแก้ปัญหานี้คุณต้องมีระบบการอนุญาตของระบบปฏิบัติการตามที่คุณถูก จำกัด ไว้ในกรณีนี้ เข้าใจปัญหาให้ดีขึ้นไปข้างหน้าและตรวจสอบโฟลเดอร์ของวัตถุ git ของคุณ (.git / objects) คุณอาจเห็นบางสิ่งเช่นนั้น:

<your user_name>@<the machine name> objects]$ ls -la
total 200
drwxr-xr-x 25 <your user_name> <group_name> 2048 Feb 10 09:28 .
drwxr-xr-x  3 <his user_name> <group_name> 1024 Feb  3 15:06 ..
drwxr-xr-x  2 <his user_name> <group_name> 1024 Jan 31 13:39 02
drwxr-xr-x  2 <his user_name> <group_name> 1024 Feb  3 13:24 08

* โปรดทราบว่าการอนุญาตของไฟล์เหล่านั้นได้รับอนุญาตสำหรับผู้ใช้ของคุณเท่านั้นจะไม่มีใครเปลี่ยนแปลงมันได้ ... *

Level       u   g   o
Permission rwx r-x ---
Binary     111 101 000
Octal       7   5   0

การแก้ปัญหา

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

$ ls -la | awk '{print $3}' | sort -u 
<your user_name>
<his user_name>

ตอนนี้คุณและผู้ใช้เจ้าของไฟล์ทุกคนจะต้องเปลี่ยนการอนุญาตของไฟล์เหล่านั้นโดยทำ:

$ chmod -R 774 .

หลังจากนั้นคุณจะต้องเพิ่มคุณสมบัติใหม่ที่เทียบเท่ากับ --shared = group ที่ทำขึ้นสำหรับที่เก็บใหม่ตามเอกสารนี้ทำให้กลุ่มพื้นที่เก็บข้อมูลสามารถเขียนได้ใช้งานได้:

$ git config core.sharedRepository group

https://coderwall.com/p/8b3ksg


ฉันมีเหมือนกันusername:groupnameสำหรับฉัน แต่เมื่อฉันลองchmod -R 774 .ฉันก็สามารถวิ่งได้git add --allสำเร็จ
John Skilbeck

3

สำหรับกรณีของฉันข้อเสนอแนะไม่ทำงาน ฉันใช้ Windows และสิ่งนี้ใช้ได้กับฉัน:

  • คัดลอก repo ระยะไกลไปยังโฟลเดอร์อื่น
  • แบ่งปันโฟลเดอร์และให้สิทธิ์ที่เหมาะสม
  • ตรวจสอบให้แน่ใจว่าคุณสามารถเข้าถึงโฟลเดอร์จากเครื่องท้องถิ่นของคุณ
  • เพิ่ม repo นี้เป็น repo ระยะไกลอื่นใน repo ท้องถิ่นของคุณ ( git remote add foo //SERVERNAME/path/to/copied/git)
  • กดเพื่อฟู git push foo master. มันใช้งานได้หรือ ที่ดี! ตอนนี้ลบ repo ที่ไม่ทำงานและเปลี่ยนชื่อมันเป็นสิ่งที่มันเคยเป็นมาก่อน ตรวจสอบให้แน่ใจว่าการอนุญาตและการแชร์คุณสมบัติยังคงเหมือนเดิม

1
ในกรณีของฉันเพียงแค่คัดลอกโฟลเดอร์ในเครื่องไปยังโฟลเดอร์ใหม่ลบโฟลเดอร์เก่าและเปลี่ยนชื่อใหม่เป็นชื่อเก่าเพื่อแก้ไขปัญหาการอนุญาต
mgiuffrida

2

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

/etc/inetd.d/git-gpv

กำลังเริ่ม git-daemon ในฐานะผู้ใช้ ' ไม่มีใคร ' จึงไม่มีสิทธิ์ในการเขียน

# Who   When    What
# GPV   20Nov13 Created this by hand while reading: http://linuxclues.blogspot.co.uk/2013/06>/git-daemon-ssh-create-repository-debian.html
# GPV   20Nov13 Changed owner (to user_git) otherise nobody lack permission to update the repository
#git stream tcp nowait nobody  /usr/bin/git git daemon --inetd --verbose --enable=receive-pack --export-all /gitrepo
git stream tcp nowait user_git  /usr/bin/git git daemon --inetd --verbose --enable=receive-pack --export-all /gitrepo

(ฉันสงสัยว่าคนอื่นเรียกไฟล์ inetd conf ของพวกเขา git-gpv โดยทั่วไปแล้วมันจะอยู่ใน /etc/inetd.conf โดยตรง)


1

คุณต้องมีสิทธิ์การเขียนที่เพียงพอในไดเรกทอรีที่คุณต้องการ

ในกรณีของฉัน: เซิร์ฟเวอร์ Windows 2008

คลิกขวาที่ไดเรกทอรี git repo หรือไดเรกทอรีหลัก

คุณสมบัติ> แท็บการแชร์> การแชร์ขั้นสูง> สิทธิ์> ตรวจสอบให้แน่ใจว่าผู้ใช้มีสิทธิ์การเข้าถึงที่เหมาะสม



1

มีความเป็นไปได้เช่นกันที่คุณเพิ่มที่เก็บในเครื่องอื่นด้วยนามแฝงเดียวกัน ตัวอย่างเช่นตอนนี้คุณมี 2 โฟลเดอร์ในเครื่องที่เรียกว่าoriginดังนั้นเมื่อคุณพยายามที่จะผลักดันพื้นที่เก็บข้อมูลระยะไกลจะไม่ยอมรับข้อมูลประจำตัวของคุณ

เปลี่ยนชื่อนามแฝงที่เก็บในเครื่องของคุณคุณสามารถไปที่ลิงค์นี้https://stackoverflow.com/a/26651835/2270348

บางทีคุณอาจจะสามารถออกจากพื้นที่เก็บข้อมูล 1 ในท้องถิ่นของความชอบของคุณเป็นoriginและคนอื่น ๆ เปลี่ยนชื่อพวกเขาเช่นจากการorigin anotheroriginโปรดจำไว้ว่าสิ่งเหล่านี้เป็นเพียงนามแฝงและสิ่งที่คุณต้องทำคือจดจำชื่อแทนใหม่และสาขาระยะไกลที่เกี่ยวข้อง



0

ฉันได้สิ่งนี้เมื่อเข้าสู่โครงการ Rstudio ฉันรู้ว่าฉันลืมที่จะทำ:

sudo rstudio

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

sudo rstudio --no-sandbox

0

ใช้ sudo สำหรับกระทำ -m

  • git เพิ่ม -A
  • sudo git commit -m "ใช้ sudo for commit -m"
  • คอมไพล์ดันต้นกำเนิด branch_name

0

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

สาเหตุของข้อผิดพลาดคือข้อมูลรับรองไม่ถูกต้องใน~/.smbcredentialsไฟล์ของฉัน

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