Cách định cấu hình repo git hiện có để được chia sẻ bởi một nhóm UNIX


98

Tôi có một git repo hiện có (một cái trống) mà cho đến thời điểm này chỉ có tôi mới có thể ghi được. Tôi muốn mở nó cho một số nhóm người dùng UNIX, foo, để tất cả các thành viên của foo có thể thúc đẩy nó. Tôi biết rằng tôi có thể dễ dàng thiết lập một mới repo git với:

git init --bare --shared=group repodir
chgrp -R foo repodir

Nhưng tôi cần thao tác tương đương cho một repo dir hiện có .


4
một câu trả lời tuyệt vời cho câu hỏi này trên ServerFault (một trang StackOverflow khác).
Zearin

Câu trả lời:


114

Hãy thử điều này để tạo một kho lưu trữ hiện có repodirhoạt động cho người dùng trong nhóm foo:

chgrp -R foo repodir                 # set the group
chmod -R g+rw repodir                # allow the group to read/write
chmod g+s `find repodir -type d`     # new files get group id of directory
git init --bare --shared=all repodir # sets some important variables in repodir/config ("core.sharedRepository=2" and "receive.denyNonFastforwards=true")

14
Tôi muốn nói thêm rằng bạn có thể cũng nên đặt config.sharedRepository = true trong cấu hình của kho. kernel.org/pub/software/scm/git/docs/git-config.html
Pistos

1
Điều này khá gần với những gì tôi đã làm một mình, nhưng tôi muốn có một số xác nhận bên ngoài. Cảm ơn. :) Tôi cũng đã hy vọng sẽ có một loại git clone --shared = group, nhưng tùy chọn --shared của clone thực hiện một cái gì đó hoàn toàn khác.
Pistos

5
Bạn có thể sử dụng git init --sharedlệnh trên repo hiện có để đặt giá trị cấu hình. Bạn cũng cần thực hiện chmodlệnh để nhận được quyền của các tệp.
Spencer

1
Để xác nhận điều này cũng hữu ích nếu bạn đang gặp rắc rối vì ai đó đã thực hiện git pullvv với tư cách là người chủ thay vì www-datahoặc bất cứ điều gì chủ sở hữu và kết quả là bạn nhận được error: insufficient permission for adding an object to repository database .git/objects. Tôi nghĩ rằng tôi đã sửa quyền sở hữu của tất cả các tệp / thư mục bị sai bằng cách sử dụng find-type d/ type -f, nhưng chỉ phương pháp này mới loại bỏ được lỗi (có thể là do một tệp trong một số thư mục con không thể ghi nhóm?)
William Turrell

1
Umask của người dùng dường như vẫn áp dụng cho các tệp mới được tạo. Đó có phải là những gì bạn mong đợi? Tôi nghĩ rằng tài liệu về core.sharedRepositorysẽ đề cập đến điều này - có vẻ như vô ích nếu người dùng không làm cho tất cả các nhóm tệp của họ có thể ghi được.
Sam Brightman

47

Trong repo dir, thực hiện các lệnh sau:

git config core.sharedRepository group
chgrp -R foo repodir
chmod -R g+w repodir

Chỉnh sửa: Để giải quyết sự nhầm lẫn thường xuyên, grouplà một từ khóa thực tế, bạn không nên thay thế từ khóa này bằng tên của nhóm.


25
Đâu groupphải tên của nhóm :)
Pierre de LESPINAY 27/11/12

7
Các tệp đối tượng và gói phải là bất biến; họ phải có quyền 444 / r - r - r--.
CB Bailey

3
Sau khi cố gắng git config core.sharedRepository devsau đó gõ git configtôi nhận được fatal: bad config value for 'core.sharedrepository' in .git/configtrong git version 1.7.0.4(và có thể các phiên bản sau)
Kzqai

3
git config core.sharedRepository group groupkhông phải là tên của nhóm, mà là giá trị thực tế!
kixorz

Nếu bạn đã mắc lỗi khi sử dụng tên nhóm của mình thay vì "nhóm", chỉ cần mở .git / config trong trình soạn thảo văn bản và chỉnh sửa dòng core.sharedRepository thành "nhóm".
Tom,

43

Hợp nhất câu trả lời @David Underhill@kixorz , tôi đã đưa ra giải pháp (dứt khoát) của riêng mình.

Nó dành cho repo trần và repo không trần . Chỉ có sự khác biệt nhỏ giữa chúng, nhưng theo cách này thì rõ ràng hơn.

BÁO CÁO BARE

cd <repo.git>/                            # Enter inside the git repo
git config core.sharedRepository group    # Update the git's config
chgrp -R <group-name> .                   # Change files and directories' group
chmod -R g+w .                            # Change permissions
chmod g-w objects/pack/*                  # Git pack files should be immutable
find -type d -exec chmod g+s {} +         # New files get directory's group id

Ở đâu:

  • <repo.git>là thư mục kho lưu trữ trống, thường là trên máy chủ (ví dụ my_project.git/).
  • <group-name>là tên nhóm cho người dùng git (ví dụ người dùng ).

BỆNH VIỆN KHÔNG CHĂM SÓC

cd <project_dir>/                         # Enter inside the project directory
git config core.sharedRepository group    # Update the git's config
chgrp -R <group-name> .                   # Change files and directories' group
chmod -R g+w .                            # Change permissions
chmod g-w .git/objects/pack/*             # Git pack files should be immutable
find -type d -exec chmod g+s {} +         # New files get directory's group id

Ở đâu:

  • <project_dir>.gitthư mục dự án chứa thư mục.
  • <group-name>là tên nhóm cho người dùng git (ví dụ người dùng ).

Như Charles đã nói, cũng hãy làm: chmod g-w objects/pack/*(nếu kho lưu trữ không trống, hãy thêm trước .git/)
Wernight

ở đây làm cách nào để tìm tên nhóm hoặc cách tạo tên nhóm?
Sujithrao

'chmod g + s find . -type d' tăng lỗiunable to execute /bin/chmod: Argument list too long
Dr.X

Như @ Dr.X đã lưu ý, chmod g+s `find . -type d`không mở rộng quy mô. Sử dụngfind -type d -exec chmod g+s {} +
hagello

Tôi nghĩ rằng tất cả các đối tượng rời cũng nên ở chế độ chỉ đọc dựa trên trạng thái chia sẻ trước. Có lẽ một cái gì đó giống như chmod g-w objects/*/*. Tôi không chắc về thư mục con thông tin vì nó trống cho repo này.
Eric

3

Điều này có lẽ không cần thiết, nhưng đáng chú ý là nó git init --bare --sharedcũng đặt tùy chọn từ chốiNonFastForwards .

git config receive.denyNonFastForwards true

Ý nghĩa của tùy chọn này như sau:

receive.denyNonFastForwards

Nếu bạn rebase cam kết rằng bạn đã đẩy và sau đó cố gắng đẩy lại hoặc cố gắng đẩy một cam kết đến một nhánh từ xa không chứa cam kết mà nhánh từ xa hiện trỏ đến, bạn sẽ bị từ chối. Đây là chính sách tốt; nhưng trong trường hợp của rebase, bạn có thể xác định rằng bạn biết mình đang làm gì và có thể buộc cập nhật nhánh từ xa bằng cờ -f cho lệnh đẩy của bạn.

(từ http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration )


1

Ngoài các câu trả lời ở trên về việc cho phép một nhóm đọc / ghi, bạn cũng cần thêm người dùng vào nhóm (nói "foo").

sudo usermod -a -G [groupname] [username]

Lưu ý: trước tiên bạn sẽ phải tạo người dùng nếu nó không tồn 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.