Soru Git Basma Hatası: bir veri havuzuna nesne eklemek için yetersiz izin


Paylaşılan bir git uzaktan kumandaya itmeye çalıştığımda, aşağıdaki hatayı alıyorum: insufficient permission for adding an object to repository database

Sonra burada bir düzeltme hakkında okudum: düzeltmek  Bu, bir sonraki itme için çalıştı, çünkü tüm dosyalar doğru gruptaydı, ancak bir kere bir değişiklik olduğunda, nesne grubu içinde varsayılan grubu olan grupta yeni bir öğe yaptı. Düşünebildiğim tek şey, geliştiricilerin varsayılan grubunu kontrol ettikleri öğeler için değiştirmektir, ancak bu bir kesmek gibi görünüyor. Herhangi bir fikir? Teşekkürler.


461
2018-06-23 00:58


Menşei


Yanlışlıkla bu hatayı aldım git add ve git commitroot kullanıcısı olarak Onu bir git reset ve bu sorunun cevabı .git dizin izinleri. - StockB
Nasıl öğrenebilirim hangi oluşturmaya çalıştığı nesne (bu tür izin sorunlarını el ile ayıklarken)? Hata mesajı çok belirsiz. - mirabilos


Cevaplar:


Onarım İzinleri

Altta yatan nedeni belirledikten ve düzelttikten sonra (aşağıya bakın), izinleri onarabilirsiniz:

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

Temel nedeni düzeltmezseniz, hata geri gelmeye devam eder ve yukarıdaki komutları tekrar tekrar tekrar çalıştırmanız gerekir.

Altında yatan nedenler

Hata, aşağıdakilerden biri tarafından kaynaklanabilir:

  • Depo, paylaşılan bir havuz olacak şekilde yapılandırılmamış (bkz. core.sharedRepository içinde git help config). Eğer çıktısı:

    git config core.sharedRepository
    

    değil group veya true veya 1 ya da bir maske, koşmayı deneyin:

    git config core.sharedRepository group
    

    ve sonra tekrar tekrar çalıştırın chmod ve chgrp (yukarıdaki "Onarım İzinleri" konusuna bakın).

  • İşletim sistemi, "tüm yeni dosyalar ve alt dizinler grup sahibini miras almalıdır" şeklinde dizinlerde setgid bitini yorumlamıyor.

    Ne zaman core.sharedRepository olduğu true veya groupGit, yeni oluşturulmuş alt dizinlerin doğru gruba (tüm havuz kullanıcılarının sahip olduğu grup) sahip olduğundan emin olmak için GNU işletim sistemlerinin (ör., Her Linux dağıtımı) bir özelliğine dayanır. Bu özellik belgelenmiştir GNU coreutils belgeleri:

    ... [Yönetmen set-grup-ID biti ayarlanmışsa, yeni oluşturulan alt dosyalar dizin ile aynı grubu devralır ve yeni oluşturulan alt dizinler ana dizinin set-group-ID biti devralır. ... [Bu mekanizma, kullanıcıların kullanma gereksinimini azaltarak dosyaları daha kolay paylaşabilmelerini sağlar. chmod veya chown yeni dosyaları paylaşmak için

    Ancak, tüm işletim sistemlerinin bu özelliği yoktur (NetBSD bir örnektir). Bu işletim sistemleri için, tüm Git kullanıcılarınızın aynı varsayılan gruba sahip olduğundan emin olmalısınız. Alternatif olarak, koşarak dünyadaki yazılabilir belleği yapabilirsiniz git config core.sharedRepository world (ama dikkatli olun - bu daha az güvenlidir).

  • Dosya sistemi setgid bitini (ör., FAT) desteklemez. ext2, ext3, ext4 hepsi setgid biti desteklemektedir. Bildiğim kadarıyla, setgid biti desteklemeyen dosya sistemleri de grup sahipliği kavramını desteklemiyor, dolayısıyla tüm dosyalar ve dizinler yine aynı gruba ait olacak (hangi grup bir mount seçeneğidir). Bu durumda, tüm Git kullanıcılarının dosya sistemindeki tüm dosyalara sahip grupta olduğundan emin olun.
  • Git kullanıcılarının tümü, depo dizinlerine sahip olan aynı grupta değil. Dizinlerdeki grup sahibinin doğru olduğundan ve tüm kullanıcıların o grupta olduğundan emin olun.

692
2018-06-23 01:13



@Richard Hansen - Sahipliği zorlayarak ne demek istediğini gerçekten bilmiyorum. Ben chmod için adama bakıyorum ama bu kelimeyi anlamlandırmak için bu konuda yeterince bilgim yok :) Herhangi bir ipucu? - skaz
@GiH: Eğer unset ise hiçbir şey elde edemezsiniz false veya umask). Görmek git help config daha fazla ayrıntı için. - Richard Hansen
Vermiş olmalıyım git push kullanma kök çalışma dizinimdeki hesabı. Bazı git deposu dosyalarının sahibini buldum kök (-r--r--r--. 1 root root 6380 5月 25 12:39 9b44bd22f81b9a8d0a244fd16f7787a1b1d424) Bu cevaba göre. - LiuYan 刘研
@MattBrowne: Bir başkent olduğuna dikkat edin X, küçük harf değil x. Bir başkent X "set" anlamına gelir S_IXGRP dosya bir dizin ise (veya başka bir S_IX* bit set) ", böylece tüm dosyaları çalıştırılamaz. Gereksiz olabilir, ama belki de değil core.sharedRepository ayarlandı 0600 geçmişte bir noktada. - Richard Hansen
@francoisromain: Bu satır tüm dizinlerde setgid bitini ayarlar. Görmek gnu.org/software/coreutils/manual/html_node/... - Richard Hansen


Ubuntu için (veya herhangi bir Linux)

Proje kökünden,

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

Adınızın ve grubunuzun, ls -al komutunun çıktısının çoğunluğundaki izinlere bakarak olması gerektiğini anlayabilirsiniz.

Not: sudo hattının sonundaki yıldızı hatırla


336
2017-10-21 13:04



Teşekkürler dostum! :) Bu benim için iş yaptı. - Woppi
Harika çalıştı! Evet, nedense bazı klasörlere farklı bir isim ve grup (kök) verilmiştir. - Peter Arandorenko
Alırım: Sorry, user myuser is not allowed to execute '/bin/chown - Francisco Corrales Morales
harika, mükemmel çalışıyor - steven iseki
Benim problemim bir kere "git çekme" yi root olarak yapmıştım, bence izinleri berbat ettim ... ls .git - rogerdpack


Sadece çözümümü eklemek istedim. OS X'de bazı dizinlerde root'un sahip olduğu bir repo vardı ve diğerlerinin üzerinde (aynı zamanda benim kullanıcı dizinim olan) yukarıda listelenen aynı hatayı veren başkaları da vardı.

Çözüm müteşekkiki kolaydı. Terminalinden:

sudo chown -R Home projectdirectory

24
2018-02-14 18:18



Aynı şey bana da oldu. Nesnelerin bazılarının nasıl sahiplendiğini anlayamıyorum, ama yaptılar. - vy32
Bu harika oldu - steven iseki


sudo chmod -R ug+w .;

Temel olarak, .git/objects dosya yazma izinlerine sahip değil. Yukarıdaki satır, dizindeki tüm dosya ve klasörlere izin verir.


23
2017-12-23 06:40



Bu benim için çalıştı. Kabul edilen cevap ne yazık ki yapmadı. Teşekkürler Rajendra! - revelt


Bunu hata ayıklamanın iyi bir yolu, bir dahaki sefere, SSH, uzaktan repo'ya, cd'leri klasöre yerleştirmek ve ls -al.

Farklı kullanıcılara sahip 2-3 dosya görüyorsanız: grup sahipliğinden sorun budur.

Geçmişte bana bazı eski komut dosyalarının git repo'mıza erişmesiyle oldu ve genellikle farklı (unix) bir kullanıcı tarafından değiştirilen / değiştirilen dosyaların en sonuncusudur ve kullanıcınızın bu dosyaların üzerine yazma izni yoktur. Git özellikli tüm kullanıcıların içinde ve ardından yinelemeli olarak paylaşılan bir paylaşılan grup oluşturmalısınız. chgrp  objects klasör ve içeriği, grup sahipliğinin paylaşılması git grubudur.

Klasörde yapışkan bir bit eklemeniz gerekir, böylece klasörde oluşturulan tüm dosyalar her zaman git.

chmod g + s dizin adı

Güncelleme: Ben core.sharedRepository hakkında bilmiyordum. İyi bilmek gerekirse, muhtemelen sadece yukarıdakileri yapar.


15
2018-06-23 03:49





Koştuğunda bu kolayca gerçekleşebilir git init değişiklikleri iterken kullanmayı planladığınızdan farklı bir kullanıcı ile.

[1] 'deki yönergeleri körü körüne takip ederseniz, bu muhtemelen, git-kullanıcısını root olarak oluşturduğunuzdan ve ardından kullanıcı arasında değişiklik yapmadan hemen git init'e geçtiğinizde gerçekleşir.

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


8
2017-09-05 12:12





Benim için çözüldü ... sadece bu:

sudo chmod 777 -R .git/objects

6
2017-09-04 10:47



Chmod 777 Tüm dosyanızı, makinenizi savunmasız bırakan dünyanın geri kalanına sunması tavsiye edilmez - Elena
Tavsiyeniz ise chmod 777, 100'den 99 kez, sorunu anlamıyorsunuz ve çözmenize yardımcı olduğundan daha fazla soruna neden oluyorsunuz. Yukarıdaki kabul edilen yanıtın gösterdiği gibi, bu konu farklı değil. - jonatan
Sizce neden kabul edilebilir bir cevap önermiyorsunuz, bunun yanlış bir seçim olduğunu mu söylüyorsunuz? - Giovani
Çünkü sayfada kabul edilebilir cevaplar olsa da, bu kabul edilemez cevap hala burada. - Teh JoE
sudo chmod -R 777 .git / nesneler - Nabeel Ahmed


Bazı şeyleri ekledikten sonra ... bunları yapın ve her şey bittikten sonra itin! BANG !! Tüm problemleri başlatın ... Dikkat etmeniz gereken, hem yeni hem de mevcut projelerin tanımlanmasında bazı farklılıklar vardır. Başka bir kişi aynı dosyaları veya içeriği eklemeyi / eklemeyi / itmeyi denerse, (şu ikisi de aynı nesne olarak kalır), 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 problemi çözmek için, bu durumda kısıtlandığınız için operasyonel sistemin izin sistemlerini aklınızda bulundurmalısınız. Sorunu daha iyi anlayın, devam edin ve git nesnesinin klasörünü (.git / object) 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 sadece kullanıcılarınız için verildiğini unutmayın, hiç kimse bunu değiştiremez ... *

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

SORUNU ÇÖZMEK

Süper kullanıcı izniniz varsa, ikinci adımı kullanarak tüm izinleri kendiniz ilerletip değiştirebilirsiniz. Diğer durumlarda, tüm kullanıcılara kullanıcılarıyla oluşturdukları nesnelere sormanız gerekecek, 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 dosya sahibi kullanıcıları şu dosyaları izinlerini değiştirmek zorunda kalacaksınız:

$ chmod -R 774 .

Bundan sonra, yeni depo için --shared = grubuna eşdeğer yeni bir özellik eklemeniz gerekecek, belgelere göre, bu, deposu grup yazılabilir hale getirecek, bunu gerçekleştirecek:

$ git config core.sharedRepository group

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


4
2018-02-14 00:04



Hepsi aynıydı username:groupname benim için ama denediğimde chmod -R 774 .Sonra koşabilirim git add --allBaşarıyla. - John Skilbeck


Linux, MacOS:

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

nerede name kullanıcı adınız ve group kullanıcı adınızın ait olduğu gruptur.


3
2017-12-02 15:26