Lỗi khi đẩy sang GitHub - không đủ quyền để thêm đối tượng vào cơ sở dữ liệu kho lưu trữ


126

Tôi đang nhận được một lỗi bất thường trong khi cố gắng thực hiện "git đẩy" vào kho GitHub của mình:

Đếm các đối tượng: 8, xong.
Nén Delta bằng 2 luồng.
Đối tượng nén: 100% (4/4), xong.
Viết đối tượng: 100% (5/5), 1.37 KiB, xong.
Tổng cộng 5 (delta 2), tái sử dụng 0 (delta 0)
lỗi: không đủ quyền để thêm một đối tượng vào cơ sở dữ liệu kho lưu trữ ./objects

gây tử vong: không viết được đối tượng
lỗi: giải nén các đối tượng đã thoát với mã lỗi 128
lỗi: giải nén thất bại: unpack-object thoát bất thường
Tới git@github.com: bixo / bixo.git
 ! [từ chối] master -> master (n / a (lỗi bộ giải nén))
lỗi: không thể đẩy một số giới thiệu đến 'git@github.com: bixo / bixo.git'
  • Sau khi sao chép sạch từ GitHub, tôi có thể chỉnh sửa / thêm / cam kết / đẩy tệp đã sửa đổi.
  • Nếu sau đó tôi lặp lại điều này lần thứ hai, tôi nhận được lỗi trên.
  • Tôi có thể đẩy sang các kho GitHub khác tốt.
  • Tôi đã kiểm tra quyền truy cập tệp / thư mục về phía tôi và chúng có vẻ ổn.
  • Tôi đang chạy git 1.6.2.3 trên Mac OS X 10.5.8

Kho lưu trữ ở trên là nguồn vui của tôi cho câu hỏi Stack Overflow trước đó ( SO 1904860 ), vì vậy có thể repo GitHub đã bị hỏng. Vấn đề tương tự duy nhất tôi tìm thấy qua tìm kiếm là một sự cố không giải nén được báo cáo trên github. Có ai khác gặp phải vấn đề này trước đây, đặc biệt là khi không sử dụng GitHub?



1
Một gợi ý khác cho những người mắc lỗi này: Tôi gặp lỗi này vì tôi đã sử dụng sai người dùng để đẩy. Máy chủ của tôi có người dùng foogit; cả hai đều có thể đọc /opt/git/<repo>, nhưng chỉ gitcó thể viết cho nó. gitmặc định cho người dùng hiện tại nếu không có cái nào được đưa vào .git/config, mà tôi quên mất. Không có câu trả lời công phu nào dưới đây là cần thiết.
Sebastian

Câu trả lời:


209

Khi bạn thấy lỗi này bên ngoài github, đây là cách khắc phục.

Nhận cái này từ: http://mapopa.blogspot.com/2009/10/git-insu enough- allow-for-adding.html

ssh me@myserver
cd repository/.git

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

git config core.sharedRepository true

Sau đó, git daemon nên sử dụng quyền của tệp nhóm khi ghi vào .git / object.


4
+1 Nó làm việc cho chúng tôi. 'S' để làm sudo chmod -R g+ws *gì?
Erik B

5
Điều này sẽ cho phép mọi tệp mới được tạo bởi người dùng khác để duy trì quyền của nhóm trong thư mục gốc. Nếu không, bạn sẽ có lỗi khi đẩy lên kho lưu trữ. Xem setuid và setgid
syvex

Tôi đã gặp lỗi tương tự với Gitorious trên Debian 6 và PHPStorm IDE, với thông báo này "error: không đủ quyền để thêm một đối tượng vào cơ sở dữ liệu kho lưu trữ .git / object". Tôi đã sử dụng giải pháp này trên thư mục mẹ của các dự án, hoạt động tốt với "+ s trick".
Benj

3
repo-config đã lỗi thời. Nên git config core.sharedRepository true.
lpapp

4
Lưu ý: nếu bạn sử dụng ký tự đại diện " ", các tệp và thư mục ẩn (chẳng hạn như .git!) Có thể không bị ảnh hưởng! Vì vậy, nếu cách trên không phù hợp với bạn, hãy chạy các lệnh cho ./.git cũng như vậy
Ben Rogmans

54

Thông thường, sự cố này là do quyền của người dùng và nhóm sai trên hệ thống tệp máy chủ Git của bạn. Kho git phải thuộc sở hữu của người dùng và nhóm của anh ta.

Thí dụ:

Nếu người dùng của bạn được gọi là "git", nhóm của anh ấy là "gitgroup" và vị trí của repo Git là: git@mygitserverxyz.com: path / to / repo.git

sau đó làm một:

sudo chown -R git: đường dẫn gitgroup / đến / repo.git /

Điều này đã sửa lỗi git không đủ quyền cho tôi.


chown: người dùng không hợp lệ: `git: git '
Alan Coromano

4
@MariusKavansky thử $ USER: $ USER thay vì git: git
dwurf

Điều này chỉ hoạt động trong một thời gian trong trường hợp của tôi. Tôi phải làm lại nó sau vài lần đẩy.
BuZZ-dEE

Đây là câu trả lời tốt nhất, nhưng bạn nên nói rằng bạn có thể giới hạn chown thành ".git / object" và người dùng bạn gọi "git" chỉ là người dùng mà bạn đã đăng nhập. Thực tế là người dùng có biết hay không bởi máy chủ git không quan trọng.
Tristan

34
sudo chmod 777 -R .git/objects

4
Điều này làm việc cho tôi ... nhưng WTF ?? Tôi đã cập nhật repo trong nhiều tháng và điều này đột nhiên bắt đầu vào chiều nay ...
GojiraDeMonstah

Bản sửa lỗi đối với tôi gần như giống nhau, nhưng liên quan đến việc thay đổi / sửa lỗi chủ sở hữu của một số tệp trong thư mục .git. Tôi đã thực hiện một số bảo trì git trong khi đăng nhập là 'root' và điều này dường như đã thay đổi chủ sở hữu thành root hoặc tạo một số tệp mới với chủ sở hữu root mà git đang dựa vào. Tôi đã có một tập lệnh triển khai tự động chạy dưới chủ sở hữu 'apache' và sau đó ngừng hoạt động.
coatesap

9
chmod 777không bao giờ là một giải pháp tốt, chỉ là một cách giải quyết không an toàn. Thay vào đó, hãy thử câu trả lời của @ Syvex (với setgid)
4wk_

10

Điều này xảy ra với tôi khi tôi cố gắng git pull. Một số phân tích cho thấy ai đó đã cam kết với root trong quá khứ, do đó tạo ra một số đối tượng có quyền sở hữu root .git/objects.

Vì vậy, tôi đã chạy

cd <repo>
la .git/objects/

và điều đó cho thấy rootquyền sở hữu đối với một số đối tượng (thư mục) như thế này:

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

Sau đó tôi chạy

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

va no đa hoạt động!

Tôi đã thay thế người dùng bằng người dùng thực sự của tôi, tất nhiên.


4

Không có gì ở trên làm việc cho tôi. Một vài giờ sau tôi đã tìm thấy lý do của vấn đề: Tôi đã sử dụng url repo của loại

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

Thật không may, tôi đã lưu trữ một phiên putty với tên example.comđược cấu hình để đăng nhập với tư cách người dùng myOtherUser.

Vì vậy, trong khi tôi nghĩ git kết nối với máy chủ example.comvới 'git' của Người dùng, Git / TortoiseGit đã kết nối với phiên putty example.comsử dụng Người dùng myOtherUser. Điều này dẫn đến cùng một ..insufficient permission..lỗi chính xác (vì cả hai người dùng đều thuộc các nhóm khác nhau).

Giải pháp: Đổi tên phiên putty example.comthànhmyOtherUse@example.com


4

chmod nên được chown, vì vậy dòng chính xác là:

sudo chown -R gituser:gituser objects

3

Thật kỳ lạ, tôi đã có vấn đề này trên một bản sao của repo tôi có, nhưng không phải là một bản khác tôi có. Ngoài việc nhân bản lại repo (mà đồng nghiệp đã làm để giải quyết thành công vấn đề này), tôi đã xoay sở để thực hiện "thiết lập lại git" cho cam kết mà tôi đã có trước khi thất bại bắt đầu. Sau đó, tôi đã cam kết lại các thay đổi và tôi đã có thể đẩy thành công sau đó. Vì vậy, mặc dù tất cả các dấu hiệu đều có vấn đề trên máy chủ, nhưng trong trường hợp này rõ ràng đó là dấu hiệu của sự kỳ quặc trong repo cục bộ.


3

Tôi đã gặp lỗi này vì mỗi lần người dùng đẩy một số nội dung, nhóm tệp sẽ thay đổi thành người dùng. Và sau đó nếu một số người dùng khác cố gắng đẩy vào kho lưu trữ, nó đã gây ra lỗi cấp phép và việc đẩy bị từ chối. Vì vậy, người ta cần yêu cầu sysadmin của bạn thay đổi cài đặt của kho lưu trữ để nhóm của bất kỳ tệp nào trong kho không bị thay đổi đối với bất kỳ sự thúc đẩy nào của bất kỳ người dùng nào.

Để tránh sự cố như vậy, vui lòng đảm bảo rằng khi bạn khởi tạo kho git của mình, hãy sử dụng lệnh "git init - Shared = group".


để được giải thích thêm, bạn có thể xem liên kết stackoverflow.com/questions/16183345/
Kẻ

2

Nếu bạn vẫn gặp lỗi này sau khi thiết lập quyền, bạn có thể cần phải sửa đổi mặt nạ tạo của mình. Chúng tôi thấy các cam kết mới của chúng tôi (các thư mục trong các đối tượng) vẫn đang được tạo mà không có quyền ghi nhóm, do đó chỉ người cam kết mới có thể đẩy vào kho lưu trữ.

Chúng tôi đã khắc phục điều này bằng cách đặt ô của người dùng SSH thành 002 với một nhóm thích hợp được chia sẻ bởi tất cả người dùng.

ví dụ

umask 002

trong đó giữa 0 cho phép viết nhóm theo mặc định.


Bạn có chắc chắn có lệnh như vậy trong Unix hoặc Linux không? Bởi vì tôi khá chắc chắn rằng umask không cụ thể theo địa điểm.
Jan Hudec

Vâng, tôi xin lỗi bạn đã đúng - Tôi không biết tại sao tôi nghĩ rằng nó có một tham số thư mục bổ sung. Nó chỉ đơn giản là áp dụng cho người dùng. Tôi đã cập nhật nhận xét.
scipilot

2

Sau khi bạn thêm một số thứ ... cam kết chúng và sau khi hoàn thành đẩy nó! BANG !! Bắt đầu tất cả các vấn đề ... Như bạn sẽ thấy có một số khác biệt trong cách xác định cả dự án mới và dự án hiện tại. Nếu một số người khác cố gắng thêm / cam kết / đẩy cùng một tệp hoặc nội dung (git giữ cả hai như cùng một đối tượng), chúng tôi sẽ gặp phải lỗi sau:

$ 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

Để giải quyết vấn đề này, bạn phải có một cái gì đó trong tâm trí hệ thống cấp phép của hệ điều hành vì bạn bị hạn chế bởi nó trong trường hợp này. Tu hiểu rõ hơn vấn đề, hãy tiếp tục và kiểm tra thư mục đối tượng git của bạn (.git / object). Bạn có thể sẽ thấy một cái gì đó như thế:

<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

* Lưu ý rằng các quyền của tệp đó chỉ được cấp cho người dùng của bạn, không ai có thể thay đổi nó ... *

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

GIẢI QUYẾT VẤN ĐỀ

Nếu bạn có quyền siêu người dùng, bạn có thể tự mình chuyển tiếp và thay đổi tất cả các quyền bằng cách sử dụng bước hai, trong mọi trường hợp khác, bạn sẽ cần hỏi tất cả người dùng với các đối tượng được tạo bằng người dùng của họ, sử dụng lệnh sau để biết họ là ai :

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

Bây giờ, bạn và tất cả người dùng chủ sở hữu tệp sẽ phải thay đổi các quyền đó, thực hiện:

$ chmod -R 774 .

Sau đó, bạn sẽ cần thêm một thuộc tính mới tương đương với - Shared = nhóm được thực hiện cho kho lưu trữ mới, theo tài liệu này, điều này làm cho nhóm kho lưu trữ có thể ghi được, thực hiện nó:

$ git config core.sharedRepository group

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


2

Cố gắng làm như sau:

Chuyển đến máy chủ của bạn

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

Sau đó đi đến bản sao làm việc của bạn (kho lưu trữ cục bộ) và đóng gói lại bằng cách git repack master

Hoạt động hoàn hảo với tôi.


2

bạn có thể sử dụng cái này

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

1
Cái này đang làm gì vậy Bạn có thể thêm một lời giải thích?
Anubian Noob

điều này sẽ nhận được thư mục cấp cao nhất của repo của bạn, vì vậy lệnh sẽ hoạt động bất kể vị trí trong repo của bạn hiện đang ở đâu. Nếu bạn đã ở quyền root, bạn chỉ có thể chạy sudo chown -R $ USER: $ USER .git
Tấn Tâm

Chỉnh sửa nó thành câu hỏi của bạn. Nếu không, câu hỏi của bạn là khá vô dụng.
Anubian Noob

2
sudo su root

chown -R user:group dir

Các dir là repo git của bạn.

Sau đó làm:

git pull origin master

Bạn sẽ thấy những thay đổi về cam kết của người khác.


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

OK - hóa ra đó là một vấn đề về quyền trên GitHub đã xảy ra trong quá trình rẽ nhánh của emi / bixo thành bixo / bixo. Khi Tekkub sửa những lỗi này, nó bắt đầu hoạt động trở lại.


Điều gì đã xảy ra và làm thế nào bạn sửa chữa nó? Tôi biết cách đây một thời gian ... có ý tưởng nào không?
Nhà siêu âm

1
Đó là một vấn đề về phía GitHub - vì vậy tôi không biết chính xác họ đã làm gì để khắc phục nó, chỉ là "Tekkub" tại GitHub đã nói "Tôi đã sửa các quyền" và sau đó nó đã hoạt động.
kkrugler

Mát mẻ. Cảm ơn bạn về thông tin. Tôi cố gắng nhân bản lại repo. Không tối ưu, nhưng nó đã làm việc. Chúc mừng!
Nhà siêu âm

4
Chúng tôi, uh, chúng tôi đã sửa lỗi . Vì vậy, anh ta sẽ không nhận được tiền lương nữa, vì vậy nó sẽ tự hoạt động một cách tự nhiên.
Alan

1

Vì lỗi liên quan đến các quyền trên thư mục đối tượng, tôi đã thực hiện một thao tác trực tiếp trên thư mục đối tượng và nó hoạt động với tôi.


1

Những công việc này:

sudo chmod -R gituser.gituser objects

1
Số chmodthay đổi quyền truy cập tệp và cần các chế độ làm đối số, không phải người dùng và nhóm. Đó là chmod -R ${some_octal_num} blahoặcchown -R ${some_user}:${some_group} bla
Dennis Winter

1

Tôi đoán nhiều người như tôi kết thúc trong các diễn đàn như thế này khi vấn đề git như mô tả ở trên xảy ra. Tuy nhiên, có rất nhiều nguyên nhân có thể dẫn đến vấn đề mà tôi chỉ muốn chia sẻ những gì gây ra rắc rối của tôi cho người khác học như tôi đã học được từ trên.

Tôi có repos của tôi trên một Linux Linux từ sitecom (Không bao giờ mua NAS từ Sitecom, pleeaaase). Tôi có một repo ở đây được nhân bản trên nhiều máy tính nhưng đột nhiên tôi bị từ chối đẩy vào. Gần đây tôi đã cài đặt một plugin để NAS của tôi có thể đứng như một máy chủ squeezebox.

Máy chủ này quét phương tiện để chia sẻ. Điều tôi không biết là có thể do lỗi, máy chủ thay đổi cài đặt người dùng và nhóm thành bóp: người dùng cho tất cả các tệp mà nó nhìn vào. Và đó là TẤT CẢ các tập tin. Do đó thay đổi các quyền tôi đã phải đẩy.

Máy chủ không còn nữa và cài đặt quyền thích hợp được thiết lập lại và mọi thứ hoạt động hoàn hảo.

Tôi đã sử dụng

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

Trường hợp myuser và mygroup ngoài khóa học phải được thay thế bằng các cài đặt thích hợp cho hệ thống của bạn. thử git: git hoặc gituser: gituser hoặc thứ gì khác mà bạn có thể thích.,


1

Kiểm tra kho lưu trữ: $ 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)

Lưu ý rằng có một chuỗi con 'git @' ở đây, nó hướng dẫn git xác thực là tên người dùng 'git' trên máy chủ từ xa. Nếu bạn bỏ qua dòng này, git sẽ xác thực dưới tên người dùng khác, do đó lỗi này sẽ xảy ra.


1

Trong trường hợp của tôi, không có xác thực hợp nhất (ví dụ: trong miền + dịch vụ giống như AD) giữa máy của tôi và máy chủ ảo git. Do đó, người dùng và nhóm git là cục bộ cho máy chủ ảo. Trong trường hợp của tôi, người dùng từ xa của tôi (mà tôi sử dụng để đăng nhập vào máy chủ từ xa) chỉ không được thêm vào nhóm git từ xa.

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

Sau đó, kiểm tra các quyền như được mô tả trong các bài viết ở trên ...


1

Bạn đã thử sudo git đẩy -u nguồn gốc --all ? Đôi khi đó là điều duy nhất bạn cần để tránh vấn đề này. Nó hỏi bạn mật khẩu hệ thống quản trị viên - mật khẩu bạn có thể đăng nhập vào máy của mình - và đó là những gì bạn cần đẩy - hoặc cam kết, nếu đó là trường hợp.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.