Kesalahan mendorong ke GitHub - izin tidak cukup untuk menambahkan objek ke database repositori

126

Saya mendapatkan kembali kesalahan yang tidak biasa saat mencoba melakukan "git push" ke repositori GitHub saya:

Menghitung objek: 8, selesai.
Kompresi delta menggunakan 2 utas.
Mengompresi objek: 100% (4/4), selesai.
Objek penulisan: 100% (5/5), 1,37 KiB, selesai.
Total 5 (delta 2), digunakan kembali 0 (delta 0)
error: izin tidak cukup untuk menambahkan objek ke database repositori ./objects

fatal: gagal menulis objek
error: unpack-objek keluar dengan kode kesalahan 128
error: unpack gagal: unpack-benda keluar tidak normal
Ke [email protected]: bixo / bixo.git
 ! master [ditolak jauh] -> master (n / a (kesalahan pembongkar paket))
galat: gagal mendorong beberapa referensi ke '[email protected]: bixo / bixo.git'
  • Setelah klon bersih dari GitHub, saya dapat mengedit / menambah / komit / mendorong file yang dimodifikasi.
  • Jika saya ulangi ini untuk kedua kalinya saya mendapatkan kesalahan di atas.
  • Saya bisa mendorong repositori GitHub lainnya dengan baik.
  • Saya telah memeriksa izin file / direktori di pihak saya, dan tampaknya OK.
  • Saya menjalankan git 1.6.2.3 di Mac OS X 10.5.8

Repositori di atas adalah sumber kesenangan saya untuk pertanyaan Stack Overflow sebelumnya ( SO 1904860 ), jadi mungkin repo GitHub rusak. Satu-satunya masalah serupa yang saya temukan melalui pencarian adalah masalah gagal yang dilaporkan pada github. Adakah orang lain yang mengalami masalah ini sebelumnya, terutama saat tidak menggunakan GitHub?

kkrugler
sumber
1
Petunjuk lain untuk orang-orang dengan kesalahan ini: Saya mendapatkan kesalahan ini karena saya menggunakan pengguna yang salah untuk mendorong. Server saya memiliki pengguna foodan git; keduanya bisa membaca /opt/git/<repo>, tetapi hanya gitbisa menulis untuk itu. gitdefault untuk pengguna saat ini jika tidak ada yang diberikan .git/config, yang saya lupa. Tidak ada jawaban rumit di bawah ini yang diperlukan.
Sebastian

Jawaban:

209

Saat Anda melihat kesalahan ini di luar github, inilah obatnya.

Dapatkan ini dari: 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

Setelah ini, daemon git harus menggunakan izin file grup saat menulis ke .git / objek.

syvex
sumber
4
+1 Ini bekerja untuk kita. Untuk apa di dalam sudo chmod -R g+ws *?
Erik B
5
Ini akan memungkinkan semua file baru yang dibuat oleh pengguna lain untuk mempertahankan izin grup dari direktori root. Jika tidak, Anda akan mengalami kesalahan saat mendorong repositori. Lihat setuid dan setgid
syvex
Saya mendapat kesalahan yang sama dengan Gitorious pada Debian 6 dan IDE PHPStorm, dengan pesan ini "error: izin tidak cukup untuk menambahkan objek ke basis data repositori .git / objek". Saya menggunakan solusi ini pada folder induk proyek, berfungsi baik dengan "+ s trick".
Benj
3
repo-config sudah usang. Seharusnya git config core.sharedRepository true.
lpapp
4
Catatan: jika Anda menggunakan wildcard " ", file dan folder tersembunyi (seperti .git!) Mungkin tidak akan terpengaruh! Jadi, jika hal di atas tidak bekerja untuk Anda, jalankan perintah untuk ./.git juga
Ben Rogmans
54

Biasanya masalah ini disebabkan oleh izin pengguna dan grup yang salah pada sistem file server Git Anda. Repositori git harus dimiliki oleh pengguna dan juga grupnya.

Contoh:

Jika pengguna Anda disebut "git", grupnya "gitgroup", dan lokasi repo Git adalah: [email protected]: path / to / repo.git

lalu lakukan:

sudo chown -R git: jalur gitgroup / ke / repo.git /

Ini memperbaiki kesalahan izin git tidak mencukupi bagi saya.

Bijan
sumber
chown: pengguna tidak valid: `git: git '
Alan Coromano
4
@MariusKavansky coba $ USER: $ USER alih-alih git: git
dwurf
Ini hanya berfungsi untuk beberapa waktu dalam kasus saya. Saya harus mengulanginya setelah beberapa dorongan.
BuZZ-dEE
Ini adalah jawaban terbaik, tetapi Anda harus mengatakan Anda dapat membatasi chown menjadi ".git / objek" dan pengguna yang Anda panggil "git" hanyalah pengguna yang Anda gunakan untuk login. Fakta bahwa pengguna diketahui atau tidak oleh server git tidak penting.
Tristan
34
sudo chmod 777 -R .git/objects
Farid Movsumov
sumber
4
Ini bekerja untuk saya ... tapi WTF ?? Saya telah memperbarui repo selama berbulan-bulan dan ini tiba-tiba dimulai sore ini ...
GojiraDeMonstah
Perbaikan untuk saya hampir sama, tetapi melibatkan mengubah / mengoreksi pemilik beberapa file dalam direktori .git. Saya telah melakukan beberapa perawatan git sementara login sebagai 'root', dan ini tampaknya telah mengubah pemilik menjadi root atau membuat beberapa file baru dengan pemilik root yang git andalkan. Saya memiliki skrip penyebaran otomatis yang berjalan di bawah pemilik 'apache' yang kemudian berhenti berfungsi.
coatesap
9
chmod 777tidak pernah merupakan solusi yang baik, hanya solusi yang tidak aman. Coba sebagai jawaban @ Syvex sebagai gantinya (dengan setgid)
4wk_
10

Ini terjadi pada saya ketika saya mencoba git pull. Beberapa analisis menunjukkan bahwa seseorang telah melakukan root di masa lalu, sehingga menciptakan beberapa objek dengan kepemilikan root di dalamnya.git/objects .

Jadi saya berlari

cd <repo>
la .git/objects/

dan itu menunjukkan rootkepemilikan untuk beberapa objek (direktori) seperti ini:

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

Lalu aku berlari

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

dan itu berhasil!

Saya mengganti pengguna dengan pengguna asli saya, tentu saja.

Thomas
sumber
4

Tidak ada yang di atas bekerja untuk saya. Beberapa jam kemudian saya menemukan alasan untuk masalah ini: Saya menggunakan jenis repo dari jenis itu

ssh://[email protected]/~git/repo.git

Sayangnya saya menyimpan sesi dempul dengan nama example.comyang dikonfigurasi untuk masuk sebagai penggunamyOtherUser .

Jadi, sementara saya pikir git terhubung ke host example.comdengan 'git' Pengguna, Git / TortoiseGit telah terhubung ke sesi dempul example.comyang menggunakan Pengguna myOtherUser. Ini mengarah ke hal yang sama persis..insufficient permission.. kesalahan yang (karena kedua pengguna berada dalam grup yang berbeda).

Solusi: Ubah nama sesi dempul example.commenjadi[email protected]

Zensursula
sumber
4

chmod harus chown, jadi baris yang benar adalah:

sudo chown -R gituser:gituser objects
rubyan
sumber
3

Anehnya, saya memiliki masalah ini pada satu klon dari repo yang saya miliki, tetapi tidak pada yang lain. Selain mengkloning ulang repo (yang dilakukan rekan kerja untuk berhasil mengatasi masalah ini), saya berhasil melakukan "git reset" ke komit yang saya miliki sebelum kegagalan dimulai. Kemudian saya kembali melakukan perubahan, dan saya berhasil mendorong setelah itu. Jadi terlepas dari semua indikasi ada masalah pada server, dalam hal ini tampaknya merupakan indikasi beberapa keanehan dalam repo lokal.

dotdotdotPaul
sumber
3

Saya mendapatkan kesalahan ini karena setiap kali pengguna mendorong beberapa konten, grup file berubah menjadi pengguna. Dan kemudian jika beberapa pengguna lain mencoba mendorong ke dalam repositori, itu menyebabkan kesalahan izin dan push ditolak. Jadi, seseorang perlu meminta sysadmin Anda untuk mengubah pengaturan repositori sehingga grup file apa pun di repositori tidak diubah untuk dorongan apa pun oleh pengguna mana pun.

Untuk menghindari masalah seperti itu, harap pastikan bahwa ketika Anda menginisialisasi repositori git Anda, gunakan perintah "git init - shared = group".

Arun Chaudhary
sumber
untuk penjelasan lebih lanjut Anda dapat melihat tautan stackoverflow.com/questions/16183345/...
Arun Chaudhary
2

Jika Anda masih mendapatkan kesalahan ini nanti setelah mengatur izin Anda mungkin perlu memodifikasi topeng kreasi Anda. Kami menemukan komit baru kami (folder di bawah objek) masih sedang dibuat tanpa izin menulis grup, oleh karena itu hanya orang yang melakukannya dapat mendorong ke dalam repositori.

Kami memperbaikinya dengan mengatur umask pengguna SSH ke 002 dengan grup yang sesuai dibagikan oleh semua pengguna.

misalnya

umask 002

di mana 0 tengah memungkinkan grup menulis secara default.

Scipilot
sumber
Apakah Anda yakin ada perintah seperti itu di Unix atau Linux? Karena saya cukup yakin bahwa umask tidak spesifik lokasi.
Jan Hudec
Ya, maaf Anda benar - Saya tidak tahu mengapa saya pikir itu memiliki parameter direktori tambahan. Ini hanya berlaku untuk pengguna. Saya sudah memperbarui komentar.
scipilot
2

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 / melakukan / 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 dapat ditulisi oleh grup, lakukan mengeksekusi:

$ git config core.sharedRepository group

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

helmedeiros
sumber
2

Coba lakukan hal berikut:

Pergi ke Server Anda

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

Lalu pergi ke copy pekerjaan Anda (repositori lokal) dan bungkus kembali oleh git repack master

Bekerja dengan baik untuk saya.

Aleksei
sumber
2

Anda bisa menggunakan ini

sudo chown -R $USER:$USER "$(git rev-parse --show-toplevel)/.git"
Tấn Tâm
sumber
1
Apa ini? Bisakah Anda menambahkan penjelasan?
Anubian Noob
ini akan mendapatkan direktori tingkat atas dari repo Anda, jadi perintah itu akan berfungsi terlepas dari di mana repo Anda saat ini. Jika Anda sudah berada di root, Anda dapat menjalankan sudo chown -R $ USER: $ USER .git
Tấn Tâm
Edit ke pertanyaan Anda. Kalau tidak, pertanyaan Anda tidak berguna.
Anubian Noob
2
sudo su root

chown -R user:group dir

Dir adalah repo git Anda.

Kemudian lakukan:

git pull origin master

Anda akan melihat perubahan tentang komitmen oleh orang lain.

pengguna3544610
sumber
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/
Mohd Bashir
sumber
1

OK - ternyata itu adalah masalah izin pada GitHub yang terjadi selama garpu emi / bixo ke bixo / bixo. Setelah Tekkub memperbaiki ini, mulai bekerja lagi.

kkrugler
sumber
apa yang terjadi dan bagaimana Anda memperbaikinya? Saya tahu itu beberapa waktu lalu ... ada ide?
Metagrapher
1
Itu adalah masalah di pihak GitHub - jadi saya tidak tahu persis apa yang mereka lakukan untuk memperbaikinya, hanya saja "Tekkub" di GitHub mengatakan "Saya memperbaiki izin" dan kemudian berhasil.
kkrugler
Keren. Terimakasih atas infonya. Saya akhirnya kloning repo. Suboptimal, tetapi berhasil. Bersulang!
Metagrapher
4
Kami, eh, kami memperbaiki kesalahan . Jadi dia tidak akan menerima gaji lagi, jadi itu akan berhasil dengan sendirinya.
Alan
1

Karena kesalahan berkaitan dengan izin pada folder objek, saya melakukan chown langsung pada folder objek dan itu berhasil untuk saya.

n00shie
sumber
1

Ini bekerja:

sudo chmod -R gituser.gituser objects
eepage
sumber
1
Tidak. chmodMengubah izin file dan mode kebutuhan sebagai argumen, bukan pengguna dan grup. Entah itu chmod -R ${some_octal_num} blaatauchown -R ${some_user}:${some_group} bla
Dennis Winter
1

Saya kira banyak seperti saya berakhir di forum seperti ini ketika masalah git seperti yang dijelaskan di atas terjadi. Namun, ada begitu banyak penyebab yang dapat menyebabkan masalah sehingga saya hanya ingin berbagi apa yang menyebabkan masalah saya bagi orang lain untuk belajar karena saya sudah belajar dari atas.

Saya memiliki repo saya di Linux NAS dari sitecom (Jangan pernah membeli NAS dari Sitecom, pleeaaase). Saya memiliki repo di sini yang dikloning pada banyak komputer tetapi saya tiba-tiba ditolak untuk melakukannya. Baru-baru ini saya menginstal sebuah plugin sehingga NAS saya dapat berdiri sebagai server squeezebox.

Server ini memindai media untuk dibagikan. Apa yang saya tidak tahu adalah bahwa, mungkin karena bug, server mengubah pengaturan pengguna dan grup untuk memeras: pengguna untuk semua file yang dilihat. Dan itu SEMUA file. Dengan demikian mengubah hak saya harus mendorong.

Server hilang dan pengaturan hak yang benar dibangun kembali dan semuanya berfungsi dengan baik.

Saya menggunakan

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

Di mana myuser dan mygroup tentunya harus diganti dengan pengaturan yang tepat untuk sistem Anda. coba git: git atau gituser: gituser atau yang lain yang mungkin Anda sukai.,

pengguna2581924
sumber
1

Periksa repositori: $ git remote -v

origin  ssh://[email protected]:2283/srv/git/repo.git (fetch)
origin  ssh://[email protected]:2283/srv/git/repo.git (push)

Perhatikan bahwa ada substring 'git @' di sini, ia memerintahkan git untuk mengotentikasi sebagai nama pengguna 'git' pada server jarak jauh. Jika Anda menghilangkan baris ini, git akan mengotentikasi dengan nama pengguna yang berbeda, maka kesalahan ini akan terjadi.

Sergey
sumber
1

Dalam kasus saya, tidak ada otentikasi terpadu (mis. Dalam layanan domain + AD-like) antara mesin saya dan server virtual git. Oleh karena itu, pengguna dan grup git bersifat lokal untuk server virtual. Dalam kasus saya, pengguna jarak jauh saya (yang saya gunakan untuk masuk ke server jarak jauh) tidak ditambahkan ke grup remote git.

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

Setelah itu periksa izin seperti yang dijelaskan dalam posting di atas ...

Vitaly Isaev
sumber
1

Sudahkah Anda mencoba sudo git push -u origin --all ? Terkadang itu satu-satunya hal yang Anda butuhkan untuk menghindari masalah ini. Ia meminta Anda untuk kata sandi sistem admin - yang Anda bisa masuk ke mesin Anda -, dan itulah yang perlu Anda tekan - atau komit, jika itu masalahnya.

Filipe Fernandes
sumber