GitHub'a gönderilirken hata - depo veritabanına nesne eklemek için yetersiz izin


126

GitHub depoma "git itme" yapmaya çalışırken alışılmadık bir hata alıyorum:

Nesneleri sayma: 8, tamamlandı.
2 diş kullanarak delta sıkıştırması.
Nesnelerin sıkıştırılması:% 100 (4/4), bitti.
Nesne yazma:% 100 (5/5), 1.37 KiB, bitti.
Toplam 5 (delta 2), yeniden kullanılan 0 (delta 0)
hata: arşiv veritabanına bir nesne eklemek için yetersiz izin ./objects

ölümcül: nesne yazılamadı
hata: 128 hata koduyla çıkılan paket açma nesneleri
hata: paket açma başarısız: nesneleri paketten çıkarma anormal çıkış
Git@github.com'a: bixo / bixo.git
 ! [uzaktan reddedildi] ana -> ana (yok (paket açma hatası))
hata: 'git@github.com: bixo / bixo.git' adresine bazı referanslar gönderilemedi
  • GitHub'dan temiz bir klondan sonra, değiştirilmiş bir dosyayı düzenleyebilir / ekleyebilir / işleyebilir / itebilirim.
  • Daha sonra bunu ikinci kez tekrarlarsam, yukarıdaki hatayı alıyorum.
  • Diğer GitHub depolarına gayet iyi aktarabiliyorum.
  • Kendi tarafımdaki dosya / dizin izinlerini kontrol ettim ve iyi görünüyorlar.
  • Mac OS X 10.5.8 üzerinde git 1.6.2.3 çalıştırıyorum

Yukarıdaki depo, önceki bir Stack Overflow sorusu ( SO 1904860 ) için eğlencemin kaynağıydı , bu yüzden belki GitHub repo bozulmuş olabilir. Arama yoluyla bulduğum tek benzer sorun , github'da bildirilen paket açma başarısız sorunuydu. Başka kimse, özellikle daha önce bu sorunu çalıştırmak Has değil GitHub kullanarak?


1

1
Bu hatayı alan kişiler için başka bir ipucu: Bu hatayı aldım çünkü itmek için yanlış kullanıcıyı kullanıyordum. Sunucumun kullanıcısı var foove git; ikisi de okuyabilir /opt/git/<repo>, ancak yalnızca gityazabilir. gitvarsayılan olarak mevcut kullanıcı verilmezse .git/config, bunu unuttum. Aşağıdaki ayrıntılı cevapların hiçbiri gerekli değildi.
Sebastian

Yanıtlar:


209

Bu hatayı github dışında gördüğünüzde, işte bir çare.

Bunu şu adresten aldım: http://mapopa.blogspot.com/2009/10/git-insufficient-permission-for-adding.html

ssh me@myserver
cd repository/.git

sudo chmod -R g+ws *
sudo chgrp -R mygroup *

git config core.sharedRepository true

Bundan sonra git daemon, .git / nesnelere yazarken grup dosyası izinlerini kullanmalıdır.


4
+1 Bizim için çalıştı. İçinde ne var sudo chmod -R g+ws *?
Erik B

5
Bu, başka bir kullanıcı tarafından oluşturulan tüm yeni dosyaların kök dizinin grup izinlerini korumasına izin verecektir. Aksi takdirde, depoya itme konusunda hatalar yaşarsınız. Setuid ve
setgid'e

Debian 6 ve PHPStorm IDE'de Gitorious ile aynı hatayı aldım, "hata: depo veri tabanına .git / nesneler için nesne eklemek için yetersiz izin" mesajı. Bu çözümü projelerin ana klasöründe kullandım, "+ s hilesi" ile güzel çalışıyor.
Benj

3
repo-config artık kullanılmıyor. Olmalı git config core.sharedRepository true.
lpapp

4
Not: " " joker karakterini kullanırsanız , gizli dosyalar ve klasörler (.git! Gibi) etkilenmeyebilir! Yani yukarıda sizin için iş, ./.git için komutları çalışmaz yanı
Ben Rogmans

54

Genellikle bu soruna Git sunucularınızın dosya sistemindeki yanlış kullanıcı ve grup izinleri neden olur. Git deposunun sahibi ve ayrıca onun grubu olmalıdır.

Misal:

Kullanıcınız "git" olarak adlandırılmışsa, grubu "gitgroup" ise ve Git deposunun konumu: git@mygitserverxyz.com: yol / to / repo.git

o zaman şunu yapın:

sudo chown -R git: gitgroup yolu / to / repo.git /

Bu benim için git yetersiz izin hatasını düzeltti.


chown: geçersiz kullanıcı: `git: git '
Alan Coromano

4
@MariusKavansky git yerine $ USER: $ USER deneyin: git
dwurf

Bu sadece benim durumumda bir süre işe yarar. Bazı itmelerden sonra yeniden yapmam gerekiyor.
BuZZ-dEE

Bu en iyi cevaptır, ancak chown'u ".git / objects" olarak sınırlayabileceğinizi ve "git" olarak adlandırdığınız kullanıcının sadece oturum açtığınız kullanıcı olduğunu söylemelisiniz. Kullanıcının git sunucusu tarafından bilinmesi veya bilinmemesi önemli değildir.
Tristan

34
sudo chmod 777 -R .git/objects

4
Bu benim için çalıştı ... ama WTF ??
Depoyu

Benim için düzeltme neredeyse aynıydı, ancak .git dizinindeki bazı dosyaların sahibini değiştirmeyi / düzeltmeyi içeriyordu. 'Root' olarak oturum açarken biraz git bakımı yaptım ve bu, ya sahibini root olarak değiştirmiş ya da git'in güvendiği root sahibiyle yeni dosyalar yaratmış gibi görünüyordu. 'Apache' sahibi altında çalışan ve daha sonra çalışmayı durduran bir otomatik dağıtım betiğim vardı.
coatesap

9
chmod 777hiçbir zaman iyi bir çözüm değildir, yalnızca güvenli olmayan bir çözümdür. Bunun yerine @ Syvex'in cevabını deneyin (setgid ile)
4hf_

10

Bu denediğimde başıma geldi git pull. Bazı analizler, birisinin geçmişte root ile işlem yaptığını ve böylece kök sahipliğinde bazı nesneler yarattığını gösterdi .git/objects.

Bu yüzden koştum

cd <repo>
la .git/objects/

ve bu, aşağıdaki rootgibi bazı nesnelerin (dizinler) sahipliğini gösterdi :

user@host:/repo> la .git/objects/
total 540
drwxr-xr-x 135 user user 4096 Jun 16 16:29 .
drwxr-xr-x   8 user user 4096 Jun 16 16:33 ..
drwxr-xr-x   2 user user 4096 Mar  1 17:28 01
drwxr-xr-x   2 user user 4096 Mar  1 17:28 02
drwxr-xr-x   2 user user 4096 Jun 16 16:27 03
drwxr-xr-x   2 user user 4096 Mar  3 13:22 04
drwxr-xr-x   2 root root 4096 Jun 16 16:29 05
drwxr-xr-x   2 user user 4096 Jun 16 16:28 07
drwxr-xr-x   2 root root 4096 Jun 16 16:29 08

Sonra koştum

sudo chown -R user:user .git/objects/

ve işe yaradı!

Ben yerine geçecekti kullanıcıyı elbette benim gerçek kullanıcı ile.


4

Yukarıdakilerin hiçbiri benim için işe yaramadı. Birkaç saat sonra sorunun nedenini buldum: Şu türde bir repo url kullandım

ssh://git@example.com/~git/repo.git

Maalesef example.com, kullanıcı olarak oturum açmak için yapılandırılan adla bir macun oturumu kaydettim myOtherUser.

Yani, git'in ana bilgisayara example.comKullanıcı 'git' ile bağlandığını düşünürken , Git / TortoiseGit example.comKullanıcıyı kullanan macun oturumuna bağlandı myOtherUser. Bu, tam olarak aynı ..insufficient permission..hataya yol açar (çünkü her iki kullanıcı da farklı gruplardadır).

Çözüm: Macun oturumunu şu example.comşekilde yeniden adlandırın:myOtherUse@example.com


4

chmod chown olmalıdır, bu nedenle doğru satır:

sudo chown -R gituser:gituser objects

3

İşin garibi, bu sorunu sahip olduğum reponun bir klonunda buldum, ancak sahip olduğum başka bir klonda yoktu. Depoyu (bir iş arkadaşımın bu sorunu başarıyla çözmek için yaptığı) yeniden klonlamanın yanı sıra, başarısızlıklar başlamadan önce sahip olduğum işleme "git sıfırlama" yapmayı başardım. Sonra değişiklikleri yeniden yaptım ve bundan sonra başarılı bir şekilde zorlamayı başardım. Dolayısıyla, tüm belirtilere rağmen, sunucuda bir sorun vardı, bu durumda yerel depodaki bazı tuhaflıkların göstergesiydi.


3

Bu hatayı alıyordum çünkü bir kullanıcı bazı içeriği her gönderdiğinde, dosyanın grubu kullanıcıya değişti. Ve sonra başka bir kullanıcı arşive girmeye çalıştıysa, bu izin hatasına neden oldu ve itme reddedildi. Bu nedenle, sistem yöneticinizden havuzun ayarlarını değiştirmesini istemeniz gerekir, böylece havuzdaki herhangi bir dosyanın grubu herhangi bir kullanıcı tarafından herhangi bir itme durumunda değiştirilmez.

Böyle bir sorunu önlemek için, lütfen git deponuzu başlatırken "git init --shared = group" komutunu kullandığınızdan emin olun.



2

Hala daha sonra bu hata alırsanız sonra izinleri ayarını senin eserin maskesini değiştirmek gerekebilir. Yeni işlemlerimizin (nesnelerin altındaki klasörler) hala grup yazma izni olmadan oluşturulduğunu gördük, bu nedenle yalnızca bunları işleyen kişi arşive gönderebilir.

Bunu, SSH kullanıcılarının umask değerini tüm kullanıcılar tarafından paylaşılan uygun bir grupla 002 olarak ayarlayarak düzelttik.

Örneğin

umask 002

ortadaki 0 ​​varsayılan olarak grup yazmaya izin veriyor.


Unix veya Linux'ta böyle bir komutun olduğundan emin misiniz? Çünkü umask'ın konuma özgü olmadığından oldukça eminim.
Jan Hudec

Evet, üzgünüm haklısınız - neden fazladan bir dizin parametresi olduğunu düşündüğümü bilmiyorum. Basitçe kullanıcı için geçerlidir. Yorumu güncelledim.
scipilot

2

Bir şeyler ekledikten sonra ... onları işleyin ve bittikten sonra itin! BANG !! Tüm sorunlara başlayın ... Dikkat etmeniz gereken gibi, hem yeni hem de mevcut projelerin tanımlanma biçiminde bazı farklılıklar vardır. Başka bir kişi aynı dosyaları veya içeriği (git ikisini aynı nesneler olarak tut) eklemeye / işlemeye / itmeye çalışırsa, aşağıdaki hatayla karşılaşırız:

$ 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

Bu sorunu çözmek için, bu durumda kısıtlandığınız için işletim sisteminin izinler sistemini aklınızda bulundurmanız gerekir. Sorunu daha iyi anlayın, devam edin ve git nesnenizin klasörünü (.git / objects) kontrol edin. Muhtemelen böyle bir şey göreceksiniz:

<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

* Bu dosyanın izinlerinin yalnızca kullanıcılarınız için verildiğini, kimsenin onu asla değiştiremeyeceğini unutmayın ... *

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

SORUNU ÇÖZMEK

Süper kullanıcı iznine sahipseniz, ikinci adımı kullanarak tüm izinleri kendi başınıza değiştirebilir ve ileriye gidebilirsiniz; başka bir durumda, tüm kullanıcılara, kullanıcılarıyla oluşturulmuş nesneleri sormanız gerekir, kim olduklarını bilmek için aşağıdaki komutu kullanın. :

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

Artık siz ve tüm dosyanın sahibi kullanıcıların bu dosyaların iznini değiştirmesi gerekecek.

$ chmod -R 774 .

Bundan sonra, belgelere göre --shared = group'a eşdeğer olan yeni bir özellik eklemeniz gerekecek, bu, depo grubunu yazılabilir yapar, bunu çalıştırarak yapın:

$ git config core.sharedRepository group

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


2

Aşağıdakileri yapmayı deneyin:

Sunucunuza gidin

    cd rep.git
    chmod -R g+ws *
    chgrp -R git *
    git config core.sharedRepository true

Ardından, çalışma kopyanıza (yerel depo) gidin ve onu şu şekilde yeniden paketleyin: git repack master

Benim için mükemmel çalışıyor.


2

bunu kullanabilirsin

sudo chown -R $USER:$USER "$(git rev-parse --show-toplevel)/.git"

1
Bu ne yapıyor? Bir açıklama ekleyebilir misin?
Anubian Noob

bu, deponuzun en üst düzey dizinini alacaktır, böylece komut, deponuzda şu anda nerede olursanız olun çalışacaktır. Zaten kökteyseniz, sudo chown -R $ USER: $ USER .git
Tấn Tâm

Sorunuza göre düzenleyin. Aksi takdirde sorunuz oldukça işe yaramaz.
Anubian Noob

2
sudo su root

chown -R user:group dir

Dir, git deponuzdur.

O zaman yap:

git pull origin master

Başkaları tarafından yapılan işlemlerle ilgili değişiklikleri göreceksiniz.


2
 user@M063:/var/www/html/app/.git/objects$ sudo chmod 777 -R .git/objects
 user@M063:/var/www/html/app/.git/objects$ sudo chown -R user:user .git/objects/

1

Tamam - bunun GitHub'da emi / bixo'nun bixo / bixo'ya çatallanması sırasında meydana gelen bir izin sorunu olduğu ortaya çıktı. Tekkub bunları düzelttikten sonra tekrar çalışmaya başladı.


ne oldu ve nasıl düzelttin? Bir süre önce olduğunu biliyorum ... herhangi bir fikrin var mı?
Metagrapher

1
Bu GitHub tarafında bir sorundu - bu yüzden düzeltmek için tam olarak ne yaptıklarını bilmiyorum, sadece GitHub'daki "Tekkub" "izinleri düzelttim" dedi ve sonra işe yaradı.
kkrugler

Güzel. Bilgi için teşekkürler. Depoyu yeniden klonladım. Yetersiz, ama işe yaradı. Şerefe!
Metagrapher

4
Biz, uh, sorunu çözdük . Yani artık maaş çeki almayacak, bu yüzden doğal olarak kendi kendine çalışacak.
Alan

1

Hata, nesne klasöründeki izinlerle ilgilendiğinden, doğrudan nesneler klasöründe bir chown yaptım ve benim için çalıştı.


1

Bu çalışıyor:

sudo chmod -R gituser.gituser objects

1
Hayır chmod. Dosya izinlerini değiştirir ve modları bağımsız değişken olarak değiştirir, kullanıcılar ve gruplar değil. Ya chmod -R ${some_octal_num} blayachown -R ${some_user}:${some_group} bla
Dennis Winter

1

Sanırım benim gibi pek çok kişi, yukarıda anlatılan git problemi ortaya çıktığında böyle forumlarda sona eriyor. Bununla birlikte, soruna yol açabilecek o kadar çok neden var ki, yukarıda öğrendiğim gibi sorunlarımın başkalarının öğrenmesine neyin sebep olduğunu paylaşmak istiyorum.

Depolarım sitecom'dan bir Linux NAS üzerinde var (Asla Sitecom'dan NAS satın almayın, lütfen). Burada birçok bilgisayara klonlanmış, ancak birdenbire zorladığım bir depom var. Son zamanlarda NAS'ımın bir sıkıştırma kutusu sunucusu olarak durabilmesi için bir eklenti kurdum.

Bu sunucu, paylaşılacak medyayı tarar. Bilmediğim şey, olası bir hata nedeniyle, sunucunun kullanıcı ve grup ayarını sıkmak için değiştirmesiydi: baktığı tüm dosyalar için kullanıcı. Ve bu TÜM dosyalar. Böylece zorlamam gereken hakları değiştirdim.

Sunucu gitti ve uygun hak ayarları yeniden oluşturuldu ve her şey mükemmel çalışıyor.

kullandım

chmod -R g+ws *
chown -R <myuser>:<mygroup> *

Kullanıcım ve grubumun kurs dışında, sisteminiz için uygun ayarlarla değiştirilmesi gerekir. git: git veya gituser: gituser veya hoşunuza gidebilecek başka bir şey deneyin.


1

Depoyu kontrol edin: $ git remote -v

origin  ssh://git@example.com:2283/srv/git/repo.git (fetch)
origin  ssh://git@example.com:2283/srv/git/repo.git (push)

Burada bir 'git @' alt dizesi olduğuna dikkat edin, git'e uzak sunucuda 'git' kullanıcı adı olarak kimlik doğrulaması yapması talimatını verir. Bu satırı atlarsanız, git farklı bir kullanıcı adı altında kimlik doğrulaması yapacak, dolayısıyla bu hata ortaya çıkacaktır.


1

Benim durumumda, makinem ile git sanal sunucusu arasında birleşik kimlik doğrulama (örn. Etki alanı + AD benzeri hizmet içinde) yoktu. Bu nedenle git kullanıcıları ve grubu sanal sunucu için yereldir. Benim durumumda uzak kullanıcım (uzak sunucuda oturum açmak için kullandığım) uzak git grubuna eklenmedi.

ssh root@<remote_git_server>
usermod -G <remote_git_group> <your_remote_user>

Bundan sonra, yukarıdaki yazılarda anlatıldığı gibi izinleri kontrol edin ...


1

Sudo git push -u origin --all denediniz mi ? Bazen bu sorunu önlemek için ihtiyacınız olan tek şey budur. Sizden, makinenizde oturum açabileceğiniz yönetici sistem şifresini sorar ve eğer durum buysa, zorlamanız veya kaydetmeniz gereken şey budur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.