Git Push Error: रिपॉजिटरी डेटाबेस में ऑब्जेक्ट जोड़ने के लिए अपर्याप्त अनुमति


591

जब मैं किसी साझा git रिमोट को पुश करने का प्रयास करता हूं, तो मुझे निम्न त्रुटि मिलती है: insufficient permission for adding an object to repository database

तब मैंने यहां एक फिक्स के बारे में पढ़ा: फिक्स इस ने अगले पुश के लिए काम किया, क्योंकि सभी फाइलें सही समूह की थीं, लेकिन अगली बार किसी ने एक बदलाव को धक्का दिया, जिससे ऑब्जेक्ट फ़ोल्डर में एक नया आइटम बना था जिसमें उनका डिफ़ॉल्ट समूह था समूह के रूप में। केवल एक चीज जिसके बारे में मैं सोच सकता हूं कि सभी डेवलपर के डिफ़ॉल्ट समूह को उन आइटमों के लिए बदलना है, जिनकी वे जांच करते हैं, लेकिन यह हैक की तरह लगता है। कोई विचार? धन्यवाद।


मूल उपयोगकर्ता के रूप में गलती से git addऔर git commit-ing के बाद मुझे यह त्रुटि मिली । मैंने इसे तय किया git resetऔर .gitनिर्देशिका अनुमतियों को ठीक करने के लिए इस प्रश्न का उत्तर दिया ।
स्टॉकबी

मैं कैसे पता लगा सकता हूं कि यह किस ऑब्जेक्ट को बनाने की कोशिश कर रहा था (जब मैन्युअल रूप से ऐसी अनुमति समस्याओं को डीबग करना)? त्रुटि संदेश बहुत अस्पष्ट है।
mirabilos

दूसरी त्रुटि को कॉपी करते समय मुझे यह त्रुटि मिली। सबसे पहले sudo का उपयोग करके फ़ाइल। इसलिए, फाइलों में नाम और समूह के रूप में सूडो सूडो थे।
विंसेंट

जवाबों:


863

मरम्मत की अनुमति

आपके द्वारा अंतर्निहित कारण को पहचानने और तय करने के बाद (नीचे देखें), आप अनुमतियों को सुधारना चाहते हैं:

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
    

    और फिर पुनरावर्ती चलाएं chmodऔर chgrp(ऊपर "मरम्मत अनुमतियाँ देखें")।

  • ऑपरेटिंग सिस्टम निर्देशिकाओं पर सेटगिड बिट की व्याख्या नहीं करता है, क्योंकि "सभी नई फाइलें और उपनिर्देशिकाएं समूह के मालिक को इनहेरिट करनी चाहिए"।

    जब या , Git GNU ऑपरेटिंग सिस्टम (उदाहरण के लिए, हर लिनक्स वितरण) की एक सुविधा पर निर्भर करता है, तो core.sharedRepositoryयह सुनिश्चित करने के लिए कि नए बनाए गए उपनिर्देशिका सही समूह (समूह जो सभी रिपॉजिटरी के उपयोगकर्ता हैं) के स्वामित्व में हैं। यह सुविधा GNU कोरुटिल्स प्रलेखन में प्रलेखित है :truegroup

    ... [अगर] एक डायरेक्टरी का सेट-ग्रुप-आईडी बिट सेट है, तो नई बनाई गई सबफाइल्स निर्देशिका के समान समूह का वारिस करती हैं, और नई बनाई गई उपनिर्देशिकाएं पैरेंट डायरेक्टरी के सेट-ग्रुप-आईडी बिट को इनहेरिट करती हैं। ... [इस तंत्र की मदद से] उपयोगकर्ता फ़ाइलों को अधिक आसानी से साझा करते हैं, उपयोग करने की आवश्यकता को कम करके chmodया chownनई फ़ाइलों को साझा करने के लिए।

    हालांकि, सभी ऑपरेटिंग सिस्टम में यह सुविधा नहीं है (NetBSD एक उदाहरण है)। उन ऑपरेटिंग सिस्टमों के लिए, आपको यह सुनिश्चित करना चाहिए कि आपके सभी Git उपयोगकर्ताओं के पास एक ही डिफ़ॉल्ट समूह है। वैकल्पिक रूप से, आप रिपॉजिटरी को चलने-फिरने लायक बना सकते हैं git config core.sharedRepository world(लेकिन सावधान रहें - यह कम सुरक्षित है)।

  • फ़ाइल सिस्टम सेटगिड बिट (जैसे, FAT) का समर्थन नहीं करता है। ext2, ext3, ext4 सभी सेटगिट बिट का समर्थन करते हैं। जहां तक ​​मुझे पता है, फ़ाइल सिस्टम जो सेटगिट बिट का समर्थन नहीं करता है, वह समूह के स्वामित्व की अवधारणा का भी समर्थन नहीं करता है, इसलिए सभी फाइलें और निर्देशिकाएं वैसे भी एक ही समूह के स्वामित्व में होंगी (जो समूह माउंट विकल्प है)। इस स्थिति में, सुनिश्चित करें कि सभी Git उपयोगकर्ता समूह में हैं जो फ़ाइल सिस्टम के सभी फ़ाइलों के स्वामी हैं।
  • Git के सभी उपयोगकर्ता एक ही समूह में नहीं हैं जो रिपॉजिटरी डायरेक्टरी के मालिक हैं। सुनिश्चित करें कि निर्देशिकाओं पर समूह का स्वामी सही है और सभी उपयोगकर्ता उस समूह में हैं।

1
@ रीचर्ड हैनसेन - मुझे वास्तव में यह नहीं पता है कि आपके स्वामित्व का मतलब क्या है। मैं chmod के लिए आदमी को देख रहा हूं, लेकिन इस बारे में पर्याप्त नहीं जानता कि शब्दों का अर्थ क्या है :) कोई सुझाव?
2

7
@ जीआईएच: यदि आप परेशान हैं (जो जैसा है falseया जैसा है umask) आपको कुछ भी नहीं मिलेगा । git help configअधिक जानकारी के लिए देखें।
रिचर्ड हेन्सन

10
मैंने अपनी कार्यशील निर्देशिका में रूट खाते git pushका उपयोग करके जारी किया होगा । मैंने पाया कि कुछ गिट रिपॉजिटरी फाइलों का मालिक इस उत्तर के अनुसार रूट ( ) है। -r--r--r--. 1 root root 6380 5月 25 12:39 9b44bd22f81b9a8d0a244fd16f7787a1b1d424
लियूयान

3
@MattBrowne: ध्यान दें कि यह एक राजधानी है X, निचला हिस्सा नहीं x। एक कैपिटल का Xअर्थ है " S_IXGRPयदि फ़ाइल एक निर्देशिका है (या यदि कोई अन्य S_IX*बिट सेट है)", तो यह सभी फाइलों को निष्पादन योग्य नहीं बनाएगी। यह अनावश्यक हो सकता है, लेकिन शायद नहीं अगर अतीत में किसी बिंदु पर core.sharedRepositoryसेट किया गया था 0600
रिचर्ड हेनसेन

2
@francoisromain: यह पंक्ति सभी निर्देशिकाओं पर सेटगिट बिट सेट करती है। देखें gnu.org/software/coreutils/manual/html_node/…
रिचर्ड हैनसेन

440

Ubuntu (या किसी भी लिनक्स) के लिए

प्रोजेक्ट रूट से,

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

आप बता सकते हैं कि उस एलएस-कमांड से आउटपुट के बहुमत पर अनुमतियों को देखकर आपका नाम और आपका समूह क्या होना चाहिए

नोट: सूडो लाइन के अंत में स्टार याद रखें


7
बढ़िया काम किया! हां, किसी कारण से कुछ फ़ोल्डरों को एक अलग नाम और समूह (रूट) सौंपा गया था।
पीटर अरंडोरेंको

2
मुझे मिलता है:Sorry, user myuser is not allowed to execute '/bin/chown
फ्रांसिस्को कॉर्लेस मोरेल्स

*सभी फर्क पड़ा। धन्यवाद।
ब्रैडली फ्लड

5
मेरी समस्या यह थी कि मैंने एक बार रूट के रूप में एक "गिट पुल" किया था, जो मुझे लगता है कि अनुमतियों को खराब कर दिया गया है ... आप एकls .git
rogerdpack

एक त्वरित समाधान के लिए धन्यवाद!
हेलवेट

74

निम्नलिखित कमांड का उपयोग करें, जादू की तरह काम करता है

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

कमांड को बिल्कुल वैसा ही लिखें जैसा वह है (अतिरिक्त स्थान और अंत में एक डॉट के साथ)


6
एक जादू की तरह काम करता है!
डॉनकाडोना

1
बहुत बढ़िया! मेरे मैक पर पूरी तरह से काम किया
सचिन खोट

इससे मुझे भी मदद मिली! धन्यवाद।
होर्वाथ एडम

सचमुच, जादू की तरह काम किया! धन्यवाद!
कुमार मनीष

49

sudo chmod -R ug+w .;

असल में, .git/objectsफ़ाइल में लिखने की अनुमति नहीं है। उपरोक्त लाइन निर्देशिका में सभी फ़ाइलों और फ़ोल्डरों को अनुमति देती है।


2
इसी से मेरा काम बना है। स्वीकार किए गए उत्तर ने दुख की बात नहीं की। धन्यवाद राजेंद्र जी!
revelt

27

मैं सिर्फ अपना समाधान जोड़ना चाहता था। मेरे पास OS X पर एक रेपो था जिसमें कुछ निर्देशिकाओं पर रूट का स्वामित्व था और अन्य पर होम (जो मेरी उपयोगकर्ता निर्देशिका है) जो ऊपर सूचीबद्ध एक ही त्रुटि का कारण था।

समाधान सरल था शुक्र है। टर्मिनल से:

sudo chown -R Home projectdirectory

वही चीज़ मेरे साथ हुई। मैं यह पता नहीं लगा सकता कि कुछ वस्तुओं को मूल स्वामित्व कैसे मिला, लेकिन उन्होंने किया।
vy32

18

डिबग करने का एक अच्छा तरीका यह है कि अगली बार ऐसा हो, SSH दूरस्थ रेपो में, ऑब्जेक्ट फ़ोल्डर में सीडी और एक फ़ोल्डर करें ls -al

यदि आप अलग-अलग उपयोगकर्ता के साथ 2-3 फ़ाइलें देखते हैं: समूह स्वामित्व समस्या है।

यह मेरे साथ अतीत में हुआ है कुछ विरासत लिपियों के साथ हमारे git रेपो का उपयोग होता है और आमतौर पर एक अलग (यूनिक्स) उपयोगकर्ता का मतलब होता है पिछली फ़ाइलों को धक्का दिया / संशोधित किया गया और आपके उपयोगकर्ता के पास उन फ़ाइलों को अधिलेखित करने की अनुमति नहीं है। आपको एक साझा git समूह बनाना चाहिए जो सभी git-enable उपयोगकर्ता फ़ोल्डर में और फिर पुनरावर्ती रूप chgrpसे objectsफ़ोल्डर में है और यह सामग्री है ताकि यह समूह स्वामित्व साझा gitसमूह है।

आपको फ़ोल्डर पर एक चिपचिपा बिट भी जोड़ना चाहिए ताकि फ़ोल्डर में बनाई गई सभी फ़ाइलों का समूह हमेशा बना रहे git

chmod g + s निर्देशिका-नाम

अद्यतन: मुझे core.saredRepository के बारे में नहीं पता था। जानकर अच्छा लगा, हालाँकि यह शायद ऊपर वाला ही करता है।


15

मेरे लिए हल ... बस यही:

sudo chmod 777 -R .git/objects

21
Chmod 777अनुशंसित नहीं है क्योंकि यह आपकी मशीन के सभी फ़ाइल को दुनिया के बाकी हिस्सों में उजागर करता है जिससे आपकी मशीन कमजोर हो जाती है
ऐलेना

23
यदि आपकी सलाह है chmod 777, तो 100 में से 99 बार आप इस मुद्दे को नहीं समझते हैं और आपको हल करने में मदद करने की तुलना में अधिक समस्याएं होने की संभावना है। जैसा कि ऊपर दिए गए स्वीकृत जवाब से पता चलता है, यह मुद्दा अलग नहीं है।
जोनाटन

आप लोग यह क्यों कहते हैं कि एक गलत विकल्प के बजाय एक स्वीकार्य उत्तर का प्रस्ताव नहीं है?
गियोवनी

2
क्योंकि पृष्ठ पर स्वीकार्य उत्तर होने के बावजूद, यह अस्वीकार्य उत्तर अभी भी यहाँ है।
तेह जोए

सुडो चामोद -R 777 .git / ऑब्जेक्ट्स
नबील अहमद

9

यह आसानी से हो सकता है यदि आप git initबदलावों को आगे बढ़ाते समय आप जिस उपयोगकर्ता का उपयोग करने की योजना बना रहे हैं, उससे भिन्न उपयोगकर्ता के साथ भाग गया हो ।

यदि आप नेत्रहीन रूप से [1] पर दिए गए निर्देशों का पालन करते हैं, तो ऐसा तब होगा जब आपने संभवतः git-user को रूट के रूप में बनाया था और फिर तुरंत बीच में उपयोगकर्ता को बदले बिना init को गिट करने के लिए चले गए।

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


7

लिनक्स, macOS:

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

nameआपका उपयोगकर्ता नाम कहां है और groupवह समूह है जो आपका उपयोगकर्ता नाम है।


5

आप कुछ सामान जोड़ने के बाद ... उन्हें कमिट करें और सब खत्म होने के बाद इसे पुश करें! बैंग !! सभी समस्याओं को शुरू करें ... जैसा कि आपको ध्यान देना चाहिए कि दोनों नई और मौजूदा परियोजनाओं को परिभाषित करने के तरीके में कुछ अंतर हैं। यदि कोई अन्य व्यक्ति समान फ़ाइलों को जोड़ने / प्रतिबद्ध / पुश करने की कोशिश करता है, या सामग्री (दोनों वस्तुओं को समान रखता है), तो हम निम्नलिखित त्रुटि का सामना करेंगे:

$ 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

इस समस्या को हल करने के लिए आपके पास परिचालन प्रणाली की अनुमति प्रणाली में कुछ होना चाहिए क्योंकि आप इस मामले में इसके द्वारा प्रतिबंधित हैं। Tu समस्या को बेहतर ढंग से समझता है, आगे बढ़ें और अपने git ऑब्जेक्ट के फ़ोल्डर (.git / ऑब्जेक्ट) की जांच करें। आप शायद ऐसा कुछ देखेंगे:

<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 .

उसके बाद आपको एक नई प्रॉपर्टी जोड़ने की आवश्यकता होगी जो नए रिपॉजिटरी के लिए --sared = group के बराबर हो, दस्तावेज़ीकरण के अनुसार, यह रिपॉजिटरी समूह-योग्य बनाता है, इसे निष्पादित करें:

$ git config core.sharedRepository group

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


मेरे पास username:groupnameमेरे लिए सभी समान थे, लेकिन जब मैंने कोशिश की chmod -R 774 ., तब मैं git add --allसफलतापूर्वक भाग सकता था ।
जॉन स्किलबेक

3

मेरे मामले के लिए किसी भी सुझाव ने काम नहीं किया। मैं विंडोज पर हूँ और यह मेरे लिए काम कर रहा है:

  • रिमोट रेपो को दूसरे फ़ोल्डर में कॉपी करें
  • फ़ोल्डर साझा करें और उचित अनुमति दें।
  • सुनिश्चित करें कि आप अपने स्थानीय मशीन से फ़ोल्डर का उपयोग कर सकते हैं।
  • अपने स्थानीय रेपो में इस रेपो को अन्य दूरस्थ रेपो के रूप में जोड़ें। (git remote add foo //SERVERNAME/path/to/copied/git )
  • धक धक करना। git push foo master। क्या यह काम किया? महान! अब नॉट-वर्किंग रेपो को डिलीट करें और जो भी पहले था उसमें यह नाम बदल दें। सुनिश्चित करें कि अनुमति और साझा संपत्ति समान बनी हुई है।

1
मेरे मामले में, बस स्थानीय फ़ोल्डर को नए फ़ोल्डर में कॉपी करना, पुराने को हटाना, और पुराने नाम पर नए का नाम बदलना अनुमतियों के मुद्दों को निर्धारित करता है।
मगफ्रीडा

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 कॉल फ़ाइल को git-gpv कहते हैं। आमतौर पर यह सीधे /etc/inetd.conf में होगा)


1

आपको उस निर्देशिका पर पर्याप्त लिखने की अनुमति चाहिए, जिस पर आप जोर दे रहे हैं।

मेरे मामले में: विंडोज 2008 सर्वर

git रेपो डायरेक्टरी या पैरेंट डायरेक्टरी पर राइट क्लिक करें।

गुण> साझाकरण टैब> उन्नत साझाकरण> अनुमतियां> सुनिश्चित करें कि उपयोगकर्ता के पास उचित अधिकार हैं।


1

आपके पास गलती से जीएसटी रिपॉजिटरी हो सकता है


1

एक संभावना यह भी है कि आपने उसी उपनाम के साथ एक और स्थानीय भंडार जोड़ा। एक उदाहरण के रूप में, अब आपके पास 2 स्थानीय फ़ोल्डर हैं जिनका उल्लेख किया गया हैorigin आप पुश करने की कोशिश करते समय करते हैं, दूरस्थ रिपॉजिटरी आपको क्रेडेंशियल स्वीकार नहीं करेगा।

स्थानीय रिपोजिटरी उपनामों का नाम बदलें, आप इस लिंक का अनुसरण कर सकते हैं https://stackoverflow.com/a/26651835/2270348

हो सकता है कि आप अपने रूप को पसंद करने के 1 स्थानीय भंडार छोड़ सकते हैं originऔर दूसरों से उदाहरण के लिए उनका नाम बदल originलिए anotherorigin। याद रखें कि ये केवल उपनाम हैं और आपको केवल नए उपनाम और उनकी संबंधित दूरस्थ शाखाओं को याद रखने की आवश्यकता है।



0

Rstudio प्रोजेक्ट में खींचने पर मुझे यह मिला। मुझे एहसास हुआ कि मैं करना भूल गया:

sudo rstudio

प्रोग्राम स्टार्टअप पर। वास्तव में जैसा कि मुझे मिला एक और बग है, मुझे वास्तव में करने की आवश्यकता है:

sudo rstudio --no-sandbox

0

प्रतिबद्ध के लिए sudo का उपयोग करें

  • git ऐड-ए
  • sudo git कमिट -m "यूज़ sudo for प्रतिबद्ध -m"
  • git पुश ओरिजिनल शाखा_नाम

0

मुझे सांबा शेयर पर रिमोट रिपॉजिटरी के साथ यह समस्या मिल रही थी; मैंने इस रिमोट से सफलतापूर्वक खींच लिया, लेकिन इसे धकेलने पर असफल रहा।

मेरी ~/.smbcredentialsफ़ाइल में त्रुटि का कारण गलत क्रेडेंशियल था ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.