Git Push Error: không đủ quyền để thêm một đối tượng vào cơ sở dữ liệu kho lưu trữ


591

Khi tôi cố gắng đẩy đến một git từ xa được chia sẻ, tôi gặp lỗi sau: insufficient permission for adding an object to repository database

Sau đó tôi đọc về một sửa chữa ở đây: Khắc phục Điều này hoạt động cho lần đẩy tiếp theo, vì tất cả các tệp đều thuộc nhóm chính xác, nhưng lần tiếp theo ai đó đẩy lên một thay đổi, nó đã tạo một mục mới trong thư mục đối tượng có nhóm mặc định của chúng như nhóm Điều duy nhất tôi có thể nghĩ đến là thay đổi tất cả nhóm mặc định của nhà phát triển cho các mục họ đăng ký, nhưng đó có vẻ như là một vụ hack. Có ý kiến ​​gì không? Cảm ơn.


Tôi đã gặp lỗi này sau khi vô tình git addgit commit-ing là người dùng root. Tôi đã sửa nó bằng một git resetcâu trả lời và câu hỏi này để sửa các .gitquyền của thư mục.
StockB

Làm cách nào tôi có thể tìm ra đối tượng nó đang cố gắng tạo (khi gỡ lỗi thủ công các vấn đề về quyền đó)? Thông báo lỗi là quá mơ hồ.
mirabilos

Tôi đã gặp lỗi này trong khi sao chép dán tệp .git khác trước bằng sudo. do đó, các tập tin có sudo sudo như tên và nhóm.
Vincent

Câu trả lời:


864

Quyền sửa chữa

Sau khi bạn đã xác định và khắc phục nguyên nhân cơ bản (xem bên dưới), bạn sẽ muốn sửa chữa các quyền:

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

Lưu ý nếu bạn muốn mọi người có thể sửa đổi kho lưu trữ, bạn không cần chgrpvà bạn sẽ muốn thay đổi chmod thànhsudo chmod -R a+rwX .

Nếu bạn không khắc phục được nguyên nhân cơ bản, lỗi sẽ tiếp tục quay trở lại và bạn sẽ phải tiếp tục chạy lại các lệnh trên nhiều lần.

Nguyên nhân cơ bản

Lỗi có thể do một trong những điều sau đây:

  • Kho lưu trữ không được cấu hình là kho lưu trữ được chia sẻ (xem core.sharedRepositorytrong git help config). Nếu đầu ra của:

    git config core.sharedRepository
    

    không grouphoặc truehoặc 1một số mặt nạ, hãy thử chạy:

    git config core.sharedRepository group
    

    và sau đó chạy lại đệ quy chmodchgrp(xem "Quyền sửa chữa" ở trên).

  • Hệ điều hành không diễn giải một bit setgid trên các thư mục là "tất cả các tệp và thư mục con mới sẽ kế thừa chủ sở hữu nhóm".

    Khi core.sharedRepositorytruehay group, Git dựa vào một tính năng của hệ điều hành GNU (ví dụ, mỗi bản phân phối Linux) để đảm bảo rằng các thư mục con mới được tạo ra đều thuộc sở hữu của nhóm đúng (nhóm mà tất cả người dùng của kho là in). Tính năng này được ghi lại trong tài liệu GNU coreutils :

    ... [Nếu] bit ID nhóm nhóm của thư mục được đặt, các tệp con mới được tạo sẽ kế thừa cùng một nhóm với thư mục và các thư mục con mới được tạo kế thừa bit ID nhóm-nhóm của thư mục mẹ. ... [Cơ chế này cho phép] người dùng chia sẻ tệp dễ dàng hơn, bằng cách giảm nhu cầu sử dụng chmodhoặc chownchia sẻ tệp mới.

    Tuy nhiên, không phải tất cả các hệ điều hành đều có tính năng này (NetBSD là một ví dụ). Đối với những hệ điều hành đó, bạn nên đảm bảo rằng tất cả người dùng Git của bạn có cùng một nhóm mặc định. Ngoài ra, bạn có thể làm cho kho lưu trữ có thể ghi trên thế giới bằng cách chạy git config core.sharedRepository world(nhưng hãy cẩn thận, điều này không an toàn).

  • Hệ thống tệp không hỗ trợ bit setgid (ví dụ: FAT). ext2, ext3, ext4 đều hỗ trợ bit setgid. Theo tôi biết, các hệ thống tệp không hỗ trợ bit setgid cũng không hỗ trợ khái niệm quyền sở hữu nhóm nên tất cả các tệp và thư mục sẽ được sở hữu bởi cùng một nhóm (nhóm nào là tùy chọn gắn kết). Trong trường hợp này, đảm bảo tất cả người dùng Git nằm trong nhóm sở hữu tất cả các tệp trong hệ thống tệp.
  • Không phải tất cả người dùng Git đều thuộc cùng một nhóm sở hữu các thư mục kho lưu trữ. Đảm bảo chủ sở hữu nhóm trên các thư mục là chính xác và tất cả người dùng nằm trong nhóm đó.

1
@Richard Hansen - Tôi thực sự không biết ý của bạn là gì khi buộc sở hữu. Tôi đang nhìn người đàn ông cho chmod nhưng không biết đủ về điều này để có những từ có ý nghĩa :) Có lời khuyên nào không?
skaz

7
@GiH: Bạn sẽ không nhận được gì nếu nó không được đặt (giống như falsehoặc umask). Xem git help configđể biết thêm chi tiết.
Richard Hansen

10
Tôi phải được cấp git pushbằng tài khoản root trong thư mục làm việc của tôi. Tôi tìm thấy chủ sở hữu của một số tệp kho git là root ( -r--r--r--. 1 root root 6380 5月 25 12:39 9b44bd22f81b9a8d0a244fd16f7787a1b1d424) theo câu trả lời này.
LiuYan 刘

3
@MattBrowne: Lưu ý rằng đó là vốn Xchứ không phải chữ thường x. Viết hoa Xcó nghĩa là "đặt S_IXGRPnếu tệp là một thư mục (hoặc nếu có bất kỳ S_IX*bit nào khác được đặt)", vì vậy nó sẽ không làm cho tất cả các tệp có thể thực thi được. Nó có thể không cần thiết, nhưng có thể không nếu core.sharedRepositoryđược đặt 0600ở một thời điểm nào đó trong quá khứ.
Richard Hansen

2
@francoisromain: Dòng đó đặt bit setgid trên tất cả các thư mục. Xem gnu.org/software/coreutils/manual/html_node/ Kẻ
Richard Hansen

440

Dành cho Ubuntu (hoặc bất kỳ Linux nào)

Từ gốc dự án,

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

Bạn có thể cho biết tên và nhóm của bạn sẽ là gì bằng cách xem các quyền trên phần lớn đầu ra từ lệnh ls -al đó

Lưu ý: nhớ ngôi sao ở cuối dòng sudo


7
Làm việc tuyệt vời! Có, vì một số lý do, một số thư mục đã được gán một tên và nhóm khác (root).
Peter Arandorenko

2
Tôi có: Sorry, user myuser is not allowed to execute '/bin/chown
Francisco Corrales Morales

Sự *khác biệt Cảm ơn.
Lũ Bradley

5
Vấn đề của tôi là tôi đã từng thực hiện một "git pull" với quyền root, mà tôi nghĩ rằng đã làm hỏng các quyền ... bạn có thể kiểm tra bằng cách thực hiệnls .git
hỏng rogerdpack

Cảm ơn cho một giải pháp nhanh chóng!
trực thăng

74

sử dụng lệnh sau, hoạt động như ma thuật

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

gõ lệnh chính xác như vậy (có thêm dấu cách và một dấu chấm ở cuối)


6
Hoạt động như một lá bùa!
doncadavona

1
tuyệt vời! hoạt động hoàn hảo trên máy mac của tôi
Sachin Khot

Điều này cũng giúp tôi! Cảm ơn.
Horvath Adam

Thật vậy, làm việc như ma thuật! Cảm ơn!
Kumar Manish

49

sudo chmod -R ug+w .;

Về cơ bản, .git/objectstập tin không có quyền ghi. Dòng trên cấp quyền cho tất cả các tệp và thư mục trong thư mục.


2
Đây là những gì làm việc cho tôi. Câu trả lời đáng buồn đã không được chấp nhận. Cảm ơn Rajendra!
tiết lộ

27

Tôi chỉ muốn thêm giải pháp của tôi. Tôi đã có một repo trên OS X có quyền sở hữu root trên một số thư mục và Home (là thư mục người dùng của tôi) trên các thư mục khác gây ra lỗi tương tự được liệt kê ở trên.

Giải pháp rất đơn giản. Từ thiết bị đầu cuối:

sudo chown -R Home projectdirectory

Điều tương tự đã xảy ra với tôi. Tôi không thể hiểu làm thế nào một số đối tượng có quyền sở hữu root, nhưng họ đã làm.
vy32

18

Một cách tốt để gỡ lỗi này là lần sau nó xảy ra, SSH vào repo từ xa, cd vào thư mục đối tượng và thực hiện một ls -al .

Nếu bạn thấy 2-3 tệp với người dùng khác nhau: quyền sở hữu nhóm thì đây là vấn đề.

Điều đó đã xảy ra với tôi trong quá khứ với một số tập lệnh kế thừa truy cập git repo của chúng tôi và thường có nghĩa là một tập tin người dùng (unix) khác được đẩy / sửa đổi lần cuối và người dùng của bạn không có quyền ghi đè lên các tập tin đó. Bạn nên tạo một nhóm git chia sẻ rằng tất cả người dùng git-enabled là trong và sau đó đệ quy chgrpcác objectsthư mục và nội dung của nó để nó của quyền sở hữu nhóm là chia sẻ gitnhóm.

Bạn cũng nên thêm một bit dính vào thư mục để tất cả các tệp được tạo trong thư mục sẽ luôn có nhóm git.

tên thư mục chmod g + s

Cập nhật: Tôi không biết về core. SharedRep repository. Tốt để biết, mặc dù nó có thể chỉ làm ở trên.


15

Đã giải quyết cho tôi ... chỉ thế này:

sudo chmod 777 -R .git/objects

21
Chmod 777không được đề xuất vì nó hiển thị tất cả các tệp của bạn với phần còn lại của thế giới làm cho máy của bạn dễ bị tổn thương
Elena

23
Nếu lời khuyên của bạn là chmod 777, 99 lần trong số 100 bạn không hiểu vấn đề và bạn có khả năng gây ra nhiều vấn đề hơn là bạn giúp giải quyết. Như câu trả lời được chấp nhận ở trên cho thấy, vấn đề này không khác.
jonatan

Tại sao các bạn không đề xuất một câu trả lời chấp nhận được thay vào đó nói rằng đó là một lựa chọn sai?
Jacani

2
Bởi vì mặc dù có câu trả lời chấp nhận được trên trang, câu trả lời không thể chấp nhận này vẫn còn ở đây.
Te JoE

sudo chmod -R 777 .git / object
Nabeel Ahmed

9

Điều này có thể dễ dàng xảy ra nếu bạn chạy git initvới một người dùng khác với người dùng bạn định sử dụng khi đẩy các thay đổi.

Nếu bạn mù quáng làm theo các hướng dẫn trên [1] thì điều này sẽ xảy ra vì bạn có thể đã tạo người dùng git làm root và ngay lập tức chuyển sang git init mà không thay đổi người dùng ở giữa.

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


7

Linux, macOS:

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

nametên người dùng của bạn ở đâu và grouplà nhóm mà tên người dùng của bạn thuộc về.


5

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


Tôi đã có tất cả giống nhau username:groupnamecho tôi, nhưng khi tôi thử chmod -R 774 ., tôi có thể chạy git add --allthành công.
John Skilbeck

3

Đối với trường hợp của tôi không có đề xuất nào làm việc. Tôi đang dùng Windows và nó hoạt động với tôi:

  • Sao chép repo từ xa vào thư mục khác
  • Chia sẻ thư mục và cung cấp quyền thích hợp.
  • Hãy chắc chắn rằng bạn có thể truy cập thư mục từ máy cục bộ của bạn.
  • Thêm repo này như một repo từ xa khác trong repo địa phương của bạn. ( git remote add foo //SERVERNAME/path/to/copied/git)
  • Đẩy đến foo. git push foo master. Nó đã làm việc? Tuyệt quá! Bây giờ xóa repo không hoạt động và đổi tên này thành bất cứ điều gì trước đây. Đảm bảo quyền và chia sẻ tài sản vẫn giữ nguyên.

1
Trong trường hợp của tôi, chỉ cần sao chép thư mục cục bộ sang thư mục mới, xóa thư mục cũ và đổi tên thư mục mới thành tên cũ đã khắc phục các sự cố về quyền.
mgiuffrida

2

Tôi nhấn vấn đề tương tự. Đọc xung quanh đây tôi nhận ra đó là quyền của tập tin mà tin nhắn đang đề cập đến. Sửa chữa, đối với tôi, là trong:

/etc/inetd.d/git-gpv

Nó đã bắt đầu git-daemon với tư cách là người dùng ' không ai ' vì vậy thiếu quyền viết.

# 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

(Tôi nghi ngờ người khác gọi tập tin inetd của họ git-gpv. Thông thường, nó sẽ trực tiếp trong /etc/inetd.conf)


1

Bạn cần có đủ quyền ghi trên thư mục mà bạn đang đẩy tới.

Trong trường hợp của tôi: máy chủ Windows 2008

nhấp chuột phải vào thư mục git repo hoặc thư mục cha.

Thuộc tính> Tab chia sẻ> Chia sẻ nâng cao> Quyền> đảm bảo người dùng có quyền truy cập phù hợp.



1

Cũng có khả năng là bạn đã thêm một kho lưu trữ cục bộ khác có cùng bí danh. Ví dụ, bây giờ bạn có 2 thư mục cục bộ được gọi làorigin vậy khi bạn cố gắng đẩy, kho lưu trữ từ xa sẽ không chấp nhận thông tin đăng nhập của bạn.

Đổi tên bí danh kho lưu trữ cục bộ, bạn có thể theo liên kết này https://stackoverflow.com/a/26651835/2270348

Có lẽ bạn có thể để lại 1 kho lưu trữ cục bộ theo ý thích của mình originvà những người khác đổi tên chúng chẳng hạn từ originthành anotherorigin. Hãy nhớ rằng đây chỉ là các bí danh và tất cả những gì bạn cần làm là nhớ các bí danh mới và các nhánh từ xa tương ứng của chúng.



0

Tôi đã nhận được điều này khi kéo vào một dự án Rstudio. Tôi nhận ra tôi đã quên làm:

sudo rstudio

khi khởi động chương trình. Trong thực tế, có một lỗi khác mà tôi gặp phải, tôi cần phải thực sự:

sudo rstudio --no-sandbox

0

Sử dụng sudo cho cam kết -m

  • git thêm -A
  • sudo git commit -m "Sử dụng sudo cho commit -m"
  • git đẩy gốc Branch_name

0

Tôi đã gặp vấn đề này với một kho lưu trữ từ xa trên chia sẻ Samba; Tôi đã kéo thành công từ điều khiển từ xa này, nhưng thất bại khi đẩy nó.

Nguyên nhân gây ra lỗi là thông tin không chính xác trong ~/.smbcredentialstệp của tôi .

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.