2011-01-28 29 views
25

Chúng tôi đang truy cập kho lưu trữ git dùng chung qua đường dẫn tệp, vì nhiều lý do tôi sẽ bỏ qua bây giờ, được tạo với --shared = group.Làm thế nào để sử dụng quyền tệp nhóm một cách chính xác trên kho lưu trữ git?

Chúng tôi có nhiều nhóm unix khác nhau nhưng tất cả đều chia sẻ một nhóm chung. Nếu tôi chạy một chgrp -R trên kho git, mọi người đều có thể đọc từ nó, nhưng nếu ai đó viết nó thường xuyên hơn không phải các tập tin mới được tạo ra mà không sử dụng nhóm chung.

Sự cố này có vẻ là do nhóm chính của chúng tôi không phải là nhóm được chia sẻ và nếu chúng tôi chạy một tệp newgrp, tất cả dường như hoạt động tốt.

Có vấn đề với cách tiếp cận này; newgrp là chậm và nó sinh ra một shell mới, làm cho tôi nghĩ rằng gọi nó trong một .bash_profile sẽ là một ý tưởng tồi, thậm chí không cân nhắc xem chúng ta có muốn tất cả các tệp mới của chúng ta sử dụng nhóm chung hay không. Dựa vào bộ nhớ để chạy nó trước khi thực hiện bất kỳ công việc git có vẻ như một công thức cho thảm họa quá mặc dù.

Vậy ... có đề xuất nào không?

+2

Hãy thử 'gitolite', bạn sẽ chỉ cần một người dùng git. – takeshin

+6

Tải xuống phần mềm khác không thực sự là một lựa chọn cho chúng tôi. – rich

Trả lời

21

Bạn cũng cần đặt setgid bit trên nhóm.

 
chgrp -R GROUP /path/to/repo 
find /path/to/repo -type d -print0 | xargs -0 chmod g+s 
+7

Không bao giờ 'chmod -R g + s' một repo git, thay vì chỉ làm những gì bạn nghĩ rằng bạn đã làm, bạn chỉ cần kích hoạt setgid trên mỗi tập tin. – Arrowmaster

+0

Vâng, đó là sự thật nó không phải là điều tốt nhất để làm. May mắn thay không ai trong số họ là thực thi. Tôi đã cập nhật các bài viết để chỉ thư mục hit thay vào đó (được yêu cầu). –

+2

Vâng, nếu bạn định sử dụng, bạn cũng có thể sử dụng lệnh -print0 để bảo vệ khỏi bất kỳ ai đủ điên để sử dụng dấu cách hoặc các ký tự lạ khác trong tên chi nhánh/thẻ của họ. – Arrowmaster

7

Đây có phải là repo trần không? Nếu nó là một repo trần và bạn sử dụng - chia sẻ khi bạn tạo ra nó thì điều này không nên xảy ra đó là lý do tại sao tôi yêu cầu.

Nếu nó là một repo trần có thể một số thư mục đã được thay đổi thành g-s, nếu điều đó xảy ra, bạn cần hoặc chỉ chmod g+x tất cả các thư mục, đảm bảo bạn không làm điều đó với bất kỳ tệp nào. Một cách dễ dàng hơn có thể chỉ là git init --bare --shared=group một repo mới và đẩy nội dung trở lại với nó từ bản sao somebody.

19

Một kho lưu trữ hiện có mà chưa được tạo ra với --shared có thể bật chia sẻ sử dụng lệnh sau:

# make the repository shared 
git config core.sharedRepository group # or whatever other sharing option 
# fix the setgid bit 
find . -type d | xargs chmod g+s 
# repair the permissions 
chmod -R g+r * 
+1

Trong trường hợp của tôi, tôi phải làm "chmod -R g + rw *" vì nhóm nên có quyền viết không chỉ đọc. Nếu không, cảm ơn câu trả lời của bạn. –

4

tôi đã phải sử dụng một sự kết hợp từ các câu trả lời ở trên:

git config core.sharedRepository group 
chgrp -R GROUP /path/to/repo 
find /path/to/repo -type d -exec chmod g+rwxs {} \; 
3

Khi trần kho lưu trữ có cờ shared=group, git sẽ xử lý phần còn lại, do đó, sau đây phải được thực hiện chỉ một lần. Ngoài ra, setgid không được dùng nữa cho mục đích sử dụng này. Ở đây tôi sao chép/dán my answer from serverfault:

Giả sử repogroup là nhóm của bạn, và bạn có cd vào thư mục repo:

Đầu tiên thay đổi lá cờ chia sẻ để group:

git config core.sharedRepository group 

Lưu ý: ở đây bạn phải sử dụng từ khóa group, không phải tên nhóm. Điều này tương đương với việc tạo kho trống với tùy chọn --shared=group.

Sau đó thay đổi nhóm cho toàn bộ kho lưu trữ:

chgrp -R repogroup . 

Để chắc chắn rằng thư mục hiện là nhóm ghi (g+w), và thực thi hiện tại cũng trở thành nhóm thực thi (g+X) bạn cũng cần đến:

chmod -R g+wX . 

Khi bạn đã thực hiện điều này, git sẽ tôn trọng cờ shared=group và chăm sóc các quyền của nhóm trong phần sau, b oth cho các tệp hiện có và mới, vì vậy bạn sẽ không bao giờ cần phải quay lại umask hoặc chgrp.

Tôi sẽ đặt nguồn vào nhận xét nếu tôi tìm lại.

Các vấn đề liên quan