it-swarm-vi.tech

Làm cách nào để chia sẻ kho Git với nhiều người dùng trên máy?

Tôi có kho lưu trữ Git trên máy chủ dàn mà nhiều nhà phát triển cần có khả năng kéo đến. git-init dường như có một lá cờ rất gần với những gì tôi đang tìm kiếm: --shared, ngoại trừ tôi cũng muốn nhiều người kéo đến kho lưu trữ đó. Các git-clone--shared cờ làm một cái gì đó hoàn toàn khác nhau.

Cách dễ nhất để thay đổi quyền của kho lưu trữ hiện tại là gì?

217
Andrey Fedorov

Quyền là một dịch hại.

Về cơ bản, bạn cần đảm bảo rằng tất cả các nhà phát triển đó có thể viết cho mọi thứ trong repo git.

Bỏ qua Giải pháp Làn sóng mới cho phương pháp ưu việt cấp cho một nhóm các nhà phát triển khả năng viết.

Giải pháp chuẩn

Nếu bạn đặt tất cả các nhà phát triển vào một nhóm được tạo đặc biệt, về nguyên tắc, bạn có thể làm:

chgrp -R <whatever group> gitrepo
chmod -R g+swX gitrepo

Sau đó thay đổi umask cho người dùng thành 002, để các tệp mới được tạo với quyền ghi theo nhóm.

Các vấn đề với điều này là quân đoàn; nếu bạn ở trên một bản phân phối giả sử umask of 022 (chẳng hạn như có một nhóm users chung bao gồm tất cả mọi người theo mặc định), điều này có thể mở ra các vấn đề bảo mật ở nơi khác. Và sớm hay muộn, một cái gì đó sẽ làm hỏng sơ đồ cấp phép được làm cẩn thận của bạn, khiến repo không hoạt động cho đến khi bạn có quyền truy cập root và sửa nó (nghĩa là chạy lại các lệnh trên).

Giải pháp sóng mới

Một giải pháp ưu việt, mặc dù ít được hiểu rõ và đòi hỏi nhiều hơn một chút về hỗ trợ hệ điều hành/công cụ OS là sử dụng các thuộc tính mở rộng POSIX. Tôi chỉ mới đến khu vực này gần đây, vì vậy kiến ​​thức của tôi ở đây là nóng nhất có thể. Nhưng về cơ bản, ACL mở rộng là khả năng đặt quyền trên nhiều hơn chỉ 3 vị trí mặc định (người dùng/nhóm/người khác).

Vì vậy, một lần nữa, tạo nhóm của bạn, sau đó chạy:

setfacl -R -m g:<whatever group>:rwX gitrepo
find gitrepo -type d | xargs setfacl -R -m d:g:<whatever group>:rwX

Điều này thiết lập ACL mở rộng cho nhóm để các thành viên trong nhóm có thể đọc/ghi/truy cập bất kỳ tệp nào đã có (dòng đầu tiên); sau đó, cũng nói với tất cả các thư mục hiện có rằng các tệp mới sẽ được áp dụng cùng ACL này (dòng thứ hai).

Hy vọng rằng có được bạn trên con đường của bạn.

193
womble

nếu bạn đã tạo kho lưu trữ (hoặc nhân bản một repo trần mới ra khỏi kho lưu trữ hiện có) với

$ git init --shared=group 

hoặc là

$ git init --shared=0NNN

Git có nhiệm vụ xử lý các quyền ở trên và vượt ra ngoài những gì ô mặc định của bạn cung cấp. Cuối cùng, điều này đúng với phiên bản Git của tôi (1.6.3). Tất nhiên điều này giả sử người dùng của bạn ở trong cùng một nhóm.

Tuy nhiên, nếu tôi cần quản lý người dùng trong nhiều nhóm với mức độ đọc/ghi khác nhau, tôi sẽ bị bệnh gitosis. Tôi cũng đã nghe đề cập đến gitolite ( http://github.com/sitaramc/gitolite ), một ngã ba gitosis được cung cấp để cung cấp quyền cấp chi nhánh, không thể nói rằng tôi đã từng sử dụng nó cá nhân mặc dù.

122
user35117

Điều này chưa được nói, vì vậy tôi muốn nhanh chóng thêm nó.

Để đảm bảo rằng các vấn đề về quyền không cắt đầu xấu xí của chúng, hãy đảm bảo đặt các mục sau trên tệp cấu hình của kho lưu trữ chia sẻ git của bạn:

[core]
    sharedRepository = true

Điều này sẽ đảm bảo rằng các cài đặt "umask" của hệ thống của bạn được tuân thủ.

55
Niels Joubert

Hướng dẫn sử dụng Git mô tả cách chia sẻ kho lưu trữ theo nhiều cách.

Phức tạp hơn, mặc dù các cách đầy đủ tính năng để chia sẻ kho là:

Chúng tôi sử dụng GitHub cho một nhóm gồm 6 nhà phát triển.

22
jtimberman

Ngoài ra, hãy xem gitolite để lưu trữ kho git của bạn. Gitosis dường như không được phát triển nữa.

9
mt3

Một cách để sửa quyền trong kho lưu trữ được chia sẻ, vì vậy người dùng sẽ không gặp vấn đề về quyền khi đẩy, là tạo tập lệnh hook sau cập nhật để thực hiện điều đó. Điều này sẽ làm việc trong bất kỳ phiên bản git.

Giả sử bạn có một kho lưu trữ được chia sẻ trong /myrepo.git. Tất cả các tệp trong kho lưu trữ đó thuộc về my Sharedgroup. Tất cả người dùng đẩy vào kho lưu trữ đó phải thuộc về nhóm chung của tôi. Bây giờ hãy tạo tệp sau (thay đổi my Sharedgroup theo sở thích của bạn):

/ myrepo.git/hook/post-update

#!/bin/sh
chmod -R g+w . 2>/dev/null
chgrp -R mysharedgroup . 2>/dev/null
4
bkmks

Để tổng hợp các bit và mẩu lời khuyên tốt từ các câu trả lời và nhận xét khác nhau về việc thiết lập một repo mới:

Nếu bạn đang thiết lập một repo hoàn toàn mới myrepo in /srv/git cho nhóm mygroup, đây là những gì bạn muốn:

mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
  1. dòng đầu tiên tạo ra repo dir
  2. dòng thứ hai đặt nhóm của nó thành mygroup
  3. dòng thứ ba khởi tạo một repo trần với cấu hình sau: [.__.]
    1. core.bare = true: làm cho nó một repo trần
    2. core.sharedrepository = 1 (giống như core.sharedrepository = group): thư mục repo và tất cả các thư mục được tạo trong đó sẽ được git quản lý để cho phép mygroup đọc, ghi và thực thi quyền (với bit sgid được đặt - để hoạt động với người dùng cho ai mygroup không phải là nhóm chính của họ)
    3. receive.denyNonFastforwards = 1: từ chối đẩy không nhanh về phía repo

Nếu bạn muốn tinh chỉnh quyền của người dùng, nhóm hoặc người dùng khác, hãy sử dụng --shared=0NNN, trong đó NNN là người dùng chuẩn, nhóm và các bit khác cho tệp (các bit thực thi và sgid trên thư mục sẽ được quản lý thích hợp bởi git ). Ví dụ: điều này cho phép đọc và ghi quyền truy cập vào người dùng và quyền truy cập chỉ đọc vào nhóm (và không có quyền truy cập vào nhóm khác):

git init --bare --shared=0640 /srv/git/myrepo.git

Điều này cho phép đọc và ghi quyền truy cập vào người dùng và nhóm (và không có quyền truy cập khác):

git init --bare --shared=0660 /srv/git/myrepo.git

Điều này cho phép truy cập đọc và ghi vào người dùng và nhóm và truy cập chỉ đọc cho người khác:

git init --bare --shared=0664 /srv/git/myrepo.git

Lưu ý rằng nếu bạn sẽ không cho phép truy cập ghi vào nhóm, trước tiên hãy đảm bảo sử dụng chown để đặt chủ sở hữu của repo, sau đó chạy git init ra lệnh cho người dùng đó (để đảm bảo repo được khởi tạo với chủ sở hữu chính xác cho tất cả các tệp và thư mục con ban đầu).

3
Justin Ludwig

Bạn có thể sử dụng git-daemon để chia sẻ kho lưu trữ. Đọc tài liệu cho git-daemon để biết thêm thông tin.

BIÊN TẬP:

Đồng thời kiểm tra bài viết này 8 cách để chia sẻ kho git của bạn .

2
Vihang D

Làm chính xác điều này làm việc cho tôi, cho một kho lưu trữ hiện có. Điều này cần lời khuyên từ một số câu trả lời và ý kiến ​​trước:

Từ thư mục mẹ kho lưu trữ của bạn, tại máy chủ:

chgrp -R <whatever group> gitrepo
chmod -R g+wX gitrepo
cd gitrepo
find . -type d -exec chmod g+s {} +
git config core.sharedRepository group
1
Luis de Arquer

@stevek_mcc câu trả lời là câu hỏi mà tôi đang tìm kiếm khi tôi googled cho câu hỏi này

git clone --config core.sharedRepository=true
0
ragerdl