Git Push Error: tidak cukup izin untuk menambahkan objek ke basis data repositori

591

Ketika saya mencoba untuk mendorong ke remote git bersama, saya mendapatkan kesalahan berikut: insufficient permission for adding an object to repository database

Lalu saya membaca tentang perbaikan di sini: Memperbaiki Ini berfungsi untuk dorongan berikutnya, karena semua file dari grup yang benar, tetapi saat berikutnya seseorang mendorong perubahan itu membuat item baru di folder objek yang memiliki grup default mereka sebagai grup. Satu-satunya hal yang dapat saya pikirkan adalah mengubah semua grup default pengembang untuk item yang mereka periksa, tapi itu seperti peretasan. Ada ide? Terima kasih.

skaz
sumber
Saya mendapatkan kesalahan ini setelah secara tidak sengaja git adddan git commit-ing sebagai pengguna root. Saya memperbaikinya dengan git resetdan jawaban pertanyaan ini untuk memperbaiki .gitizin direktori.
StockB
Bagaimana saya bisa mengetahui yang keberatan itu mencoba untuk membuat (ketika secara manual debugging masalah izin tersebut)? Pesan kesalahannya terlalu kabur.
mirabilos
Saya mendapatkan kesalahan ini saat menyalin file git lain terlebih dahulu menggunakan sudo. Oleh karena itu, file memiliki sudo sudo sebagai nama dan grup.
Vincent

Jawaban:

864

Izin Perbaikan

Setelah Anda mengidentifikasi dan memperbaiki penyebab yang mendasarinya (lihat di bawah), Anda ingin memperbaiki izin:

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

Catatan jika Anda ingin semua orang dapat memodifikasi repositori, Anda tidak perlu chgrpdan Anda ingin mengubah chmod menjadisudo chmod -R a+rwX .

Jika Anda tidak memperbaiki penyebab yang mendasarinya, kesalahan akan terus kembali dan Anda harus terus menjalankan kembali perintah di atas berulang kali.

Penyebab yang mendasari

Kesalahan dapat disebabkan oleh salah satu dari berikut ini:

  • Repositori tidak dikonfigurasikan menjadi repositori bersama (lihat core.sharedRepositorydi git help config). Jika output dari:

    git config core.sharedRepository
    

    bukan groupatau trueatau 1topeng, coba jalankan:

    git config core.sharedRepository group
    

    dan kemudian jalankan kembali rekursif chmoddan chgrp(lihat "Perbaikan Izin" di atas).

  • Sistem operasi tidak menginterpretasikan bit setgid pada direktori sebagai "semua file dan subdirektori baru harus mewarisi pemilik grup".

    Ketika core.sharedRepositoryini trueatau group, Git bergantung pada fitur sistem operasi GNU (misalnya, setiap distribusi Linux) untuk memastikan bahwa baru dibuat subdirektori dimiliki oleh kelompok yang benar (kelompok yang semua pengguna repositori berada di). Fitur ini didokumentasikan dalam dokumentasi GNU coreutils :

    ... [Jika] bit set-group-ID direktori diatur, subfile yang baru dibuat mewarisi grup yang sama dengan direktori, dan subdirektori yang baru dibuat mewarisi bit set-group-ID dari direktori induk. ... [Mekanisme ini memungkinkan] pengguna berbagi file dengan lebih mudah, dengan mengurangi kebutuhan untuk menggunakan chmodatau chownberbagi file baru.

    Namun, tidak semua sistem operasi memiliki fitur ini (NetBSD adalah salah satu contoh). Untuk sistem operasi tersebut, Anda harus memastikan bahwa semua pengguna Git Anda memiliki grup default yang sama. Sebagai alternatif, Anda dapat membuat repositori dapat ditulis oleh dunia dengan menjalankan git config core.sharedRepository world(tapi hati-hati — ini kurang aman).

  • Sistem file tidak mendukung bit setgid (misalnya, FAT). ext2, ext3, ext4 semuanya mendukung bit setgid. Sejauh yang saya tahu, sistem file yang tidak mendukung bit setgid juga tidak mendukung konsep kepemilikan grup sehingga semua file dan direktori akan dimiliki oleh grup yang sama (grup mana yang merupakan opsi mount). Dalam hal ini, pastikan semua pengguna Git berada dalam grup yang memiliki semua file dalam sistem file.
  • Tidak semua pengguna Git berada dalam grup yang sama yang memiliki direktori repositori. Pastikan pemilik grup di direktori sudah benar dan bahwa semua pengguna berada di grup itu.
Richard Hansen
sumber
1
@ Richard Hansen - Saya tidak benar-benar tahu apa yang Anda maksud dengan memaksakan kepemilikan. Saya mencari pria untuk chmod tetapi tidak cukup tahu tentang ini untuk memiliki kata-kata yang masuk akal :) Ada tips?
skaz
7
@GiH: Anda tidak akan mendapatkan apa-apa jika tidak disetel (yang sama dengan falseatau umask). Lihat git help configuntuk lebih jelasnya.
Richard Hansen
10
Saya harus mengeluarkan git pushmenggunakan akun root di direktori kerja saya. Saya menemukan pemilik beberapa file repositori git adalah root ( -r--r--r--. 1 root root 6380 5月 25 12:39 9b44bd22f81b9a8d0a244fd16f7787a1b1d424) menurut jawaban ini.
LiuYan 刘 研
3
@MattBrowne: Perhatikan bahwa ini adalah huruf besar X, bukan huruf kecil x. Huruf kapital Xberarti "mengatur S_IXGRPapakah file adalah direktori (atau jika ada S_IX*bit lain diatur)", jadi itu tidak akan membuat semua file dapat dieksekusi. Mungkin tidak perlu, tapi mungkin tidak jika core.sharedRepositorydiatur 0600pada suatu saat di masa lalu.
Richard Hansen
2
@ Francoisromain: Baris itu menetapkan bit setgid pada semua direktori. Lihat gnu.org/software/coreutils/manual/html_node/…
Richard Hansen
440

Untuk Ubuntu (atau Linux apa pun)

Dari root proyek,

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

Anda dapat mengetahui nama dan grup Anda dengan melihat izin pada sebagian besar output dari perintah ls -al

Catatan: ingat bintang di ujung garis sudo

TerryS
sumber
7
Bekerja dengan baik! Ya, untuk beberapa alasan beberapa folder diberi nama dan grup yang berbeda (root).
Peter Arandorenko
2
Saya mendapatkan:Sorry, user myuser is not allowed to execute '/bin/chown
Francisco Corrales Morales
Itu *membuat semua perbedaan. Terima kasih.
Bradley Flood
5
Masalah saya adalah saya pernah melakukan "git pull" sebagai root, yang saya pikir mengacaukan izin ... Anda dapat memeriksa dengan melakukanls .git
rogerdpack
Terima kasih atas solusi cepatnya!
Helvete
75

gunakan perintah berikut, bekerja seperti sihir

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

ketik perintah persis seperti itu (dengan spasi tambahan dan satu titik di akhir)

Code_Worm
sumber
6
Bekerja seperti pesona!
doncadavona
1
luar biasa! bekerja dengan baik pada mac saya
Sachin Khot
Ini membantu saya juga! Terima kasih.
Horvath Adam
Memang, bekerja seperti sulap! Terima kasih!
Kumar Manish
49

sudo chmod -R ug+w .;

Pada dasarnya, .git/objectsfile tidak memiliki izin menulis. Baris di atas memberikan izin untuk semua file dan folder di direktori.

Rajendra kumar Vankadari
sumber
2
Inilah yang bekerja untuk saya. Jawaban yang diterima sayangnya tidak. Terima kasih Rajendra!
kembalilah
27

Saya hanya ingin menambahkan solusi saya. Saya punya repo di OS X yang memiliki kepemilikan root pada beberapa direktori dan Home (yang merupakan direktori pengguna saya) pada yang lain yang menyebabkan kesalahan yang sama yang tercantum di atas.

Untungnya, solusinya sederhana. Dari terminal:

sudo chown -R Home projectdirectory
Brandon
sumber
Hal yang sama terjadi pada saya. Saya tidak tahu bagaimana beberapa objek mendapatkan kepemilikan root, tetapi mereka melakukannya.
vy32
18

Cara yang baik untuk men-debug ini adalah saat berikutnya terjadi, SSH ke repo jarak jauh, cd ke folder objek dan lakukan ls -al.

Jika Anda melihat 2-3 file dengan pengguna yang berbeda: kepemilikan grup lebih dari ini masalahnya.

Itu terjadi pada saya di masa lalu dengan beberapa skrip lama mengakses repositori git kami dan biasanya berarti pengguna yang berbeda (unix) mendorong / memodifikasi file terakhir dan pengguna Anda tidak memiliki izin untuk menimpa file-file itu. Anda harus membuat grup git bersama bahwa semua pengguna git-enabled berada di dan kemudian secara rekursif chgrpyang objectsfolder dan isinya itu sehingga itu kepemilikan kelompok adalah bersama gitkelompok.

Anda juga harus menambahkan sedikit lengket pada folder sehingga semua file yang dibuat dalam folder akan selalu memiliki kelompok git.

chmod g + s direktori-nama

Pembaruan: Saya tidak tahu tentang core.sharedRepository. Senang mengetahui, meskipun mungkin hanya melakukan di atas.

Mauvis Ledford
sumber
15

Dipecahkan untuk saya ... hanya ini:

sudo chmod 777 -R .git/objects
GUSTAVO BERBERT
sumber
21
Chmod 777tidak disarankan karena mengekspos semua file Anda ke seluruh dunia yang membuat mesin Anda rentan
Elena
23
Jika saran Anda adalah chmod 777, 99 kali dari 100 Anda tidak memahami masalah ini dan Anda cenderung menyebabkan lebih banyak masalah daripada yang Anda bantu selesaikan. Sebagaimana ditunjukkan oleh jawaban yang diterima di atas, masalah ini tidak berbeda.
Jonatan
Kenapa kalian tidak mengusulkan jawaban yang bisa diterima malah mengatakan itu pilihan yang salah?
Giovani
2
Karena meskipun ada jawaban yang dapat diterima di halaman, jawaban yang tidak dapat diterima ini masih ada di sini.
Teh JoE
sudo chmod -R 777 .git / objek
Nabeel Ahmed
9

Ini dapat dengan mudah terjadi jika Anda berlari git initdengan pengguna yang berbeda dari yang Anda rencanakan untuk digunakan saat mendorong perubahan.

Jika Anda secara membabi buta mengikuti instruksi pada [1] ini akan terjadi karena Anda mungkin membuat pengguna git sebagai root dan kemudian segera pindah ke git init tanpa mengubah pengguna di antaranya.

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

Gitzor
sumber
7

Linux, macOS:

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

di mana namenama pengguna Anda dan groupgrup milik nama pengguna Anda.

Afshin Mehrabani
sumber
5

Setelah Anda menambahkan beberapa hal ... komit dan setelah semua selesai dorong! BANG !! Mulai semua masalah ... Seperti yang seharusnya Anda perhatikan ada beberapa perbedaan dalam cara proyek baru dan yang ada didefinisikan. Jika beberapa orang mencoba untuk menambah / mengkomit / mendorong file yang sama, atau konten (git menyimpan keduanya sebagai objek yang sama), kita akan menghadapi kesalahan berikut:

$ 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

Untuk mengatasi masalah ini, Anda harus memiliki sesuatu dalam sistem izin sistem operasional karena Anda dibatasi olehnya dalam hal ini. Tu mengerti lebih baik masalahnya, silakan dan periksa folder objek git Anda (.git / objek). Anda mungkin akan melihat sesuatu seperti itu:

<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

* Perhatikan bahwa izin file-file itu diberikan hanya untuk pengguna Anda, tidak ada yang tidak akan pernah bisa mengubahnya ... *

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

MEMECAHKAN MASALAH

Jika Anda memiliki izin pengguna super, Anda dapat maju dan mengubah semua izin sendiri menggunakan langkah dua, dalam hal lain apa pun Anda perlu bertanya semua pengguna dengan objek yang dibuat dengan pengguna mereka, gunakan perintah berikut untuk mengetahui siapa mereka. :

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

Sekarang Anda dan semua pengguna pemilik file harus mengubah izin file-file itu, melakukan:

$ chmod -R 774 .

Setelah itu, Anda perlu menambahkan properti baru yang setara dengan - shared = grup yang dilakukan untuk repositori baru, sesuai dengan dokumentasi, ini membuat repositori-grup dapat ditulis, lakukan mengeksekusi:

$ git config core.sharedRepository group

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

helmedeiros
sumber
Saya memiliki semua yang sama username:groupnameuntuk milik saya, tetapi ketika saya mencoba chmod -R 774 ., saya kemudian dapat berlari dengan git add --allsukses.
John Skilbeck
3

Untuk kasus saya, tidak ada saran yang berfungsi. Saya menggunakan Windows dan ini bekerja untuk saya:

  • Salin repo jarak jauh ke folder lain
  • Bagikan folder dan berikan izin yang sesuai.
  • Pastikan Anda dapat mengakses folder dari mesin lokal Anda.
  • Tambahkan repo ini sebagai repo jarak jauh lain di repo lokal Anda. ( git remote add foo //SERVERNAME/path/to/copied/git)
  • Dorong ke foo. git push foo master. Apakah itu berhasil? Bagus! Sekarang hapus repo yang tidak berfungsi dan ubah nama ini menjadi apa pun sebelumnya. Pastikan izin dan berbagi properti tetap sama.
Halil Kaskavalci
sumber
1
Dalam kasus saya, cukup menyalin folder lokal ke folder baru, menghapus yang lama, dan mengganti nama yang baru ke nama lama memperbaiki masalah izin.
mgiuffrida
2

Saya mengalami masalah yang sama ini. Membaca di sekitar sini saya menyadari itu adalah izin file pesan yang dimaksud. Perbaikannya, bagi saya, ada di:

/etc/inetd.d/git-gpv

Itu mulai git-daemon sebagai pengguna ' tidak ada ' sehingga tidak memiliki izin menulis.

# 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

(Saya ragu orang lain memanggil file conf inetd mereka git-gpv. Biasanya akan langsung di /etc/inetd.conf)

GraemeV
sumber
1

Anda memerlukan izin menulis yang cukup pada direktori yang Anda dorong.

Dalam hal ini: Windows 2008 server

klik kanan pada direktori git repo atau direktori induk.

Properti> tab Berbagi> Berbagi Tingkat Lanjut> Izin> memastikan pengguna memiliki hak akses yang sesuai.

Kesemek Fuyu
sumber
1

Anda mungkin secara tidak sengaja memiliki repositori git

IliasT
sumber
1

Ada kemungkinan juga bahwa Anda menambahkan repositori lokal lain dengan alias yang sama. Sebagai contoh, Anda sekarang memiliki 2 folder lokal yang disebutorigin sehingga ketika Anda mencoba untuk mendorong, repositori jarak jauh tidak akan menerima kredensial Anda.

Ganti nama alias repositori lokal, Anda dapat mengikuti tautan ini https://stackoverflow.com/a/26651835/2270348

Mungkin Anda dapat meninggalkan 1 repositori lokal sesuai keinginan Anda origindan yang lain mengganti nama mereka misalnya dari originke anotherorigin. Ingat ini hanya alias dan yang perlu Anda lakukan hanyalah mengingat alias baru dan masing-masing cabang jarak jauh.

Huey Mataruse
sumber
0

Bekerja untukku

sudo chmod -R g+rwX .
Nitin.
sumber
0

Saya mendapatkan ini ketika menarik ke dalam proyek Rstudio. Saya menyadari saya lupa melakukan:

sudo rstudio

pada startup program. Bahkan karena ada bug lain yang saya punya, saya harus benar-benar melakukannya:

sudo rstudio --no-sandbox
Timothy Pollington
sumber
0

Gunakan sudo untuk komit -m

  • git add -A
  • sudo git commit -m "Gunakan sudo untuk commit -m"
  • git dorong asal branch_name
oparam
sumber
0

Saya mendapatkan masalah ini dengan repositori jarak jauh pada share Samba; Saya berhasil menarik dari remote ini, tetapi gagal ketika mendorongnya.

Penyebab kesalahan adalah kredensial yang salah dalam ~/.smbcredentialsfile saya .

Josh
sumber