2012-01-08 76 views
63

Tôi có bốn chi nhánh tại kho git của tôi, được quản lý sử dụng GitHub:Một cách để hạn chế quyền truy cập nhánh Git?

  • Sản
  • Staging
  • Thạc sĩ
  • [tên người] -development

Có một cách hạn chế quyền truy cập ghi vào một chi nhánh duy nhất ([tên người] - phát triển)? Làm thế nào tôi sẽ làm điều này?

Để tham khảo, một câu hỏi tương tự: How to write a git hook to restrict writing to branch?.

+0

Tôi biết câu hỏi này là lỗi thời. Nhưng hãy xem https://help.github.com/articles/about-branch-restrictions/ –

Trả lời

44

Khi sử dụng GitHub, lựa chọn tốt nhất của bạn là để mỗi nhà phát triển có một nhánh của kho lưu trữ chính. Mọi người đều đẩy vào kho lưu trữ của riêng họ và ai đó có quyền truy cập đẩy vào kho lưu trữ chính xử lý việc kéo từ kho lưu trữ của từng nhà phát triển. Đây là cách hầu hết các dự án nguồn mở hoạt động.

Nếu sử dụng máy chủ Git của riêng bạn, bạn có thể sử dụng móc để ngăn người dùng đẩy vào các nhánh sai.

+0

Để biết thông tin về cách sử dụng móc, hãy xem http://stackoverflow.com/questions/4114417/how-to-write- a-git-hook-to-restricted-writing-to-branch Có lẽ không phải là một ý hay? –

0

Không thực tế. Các nhánh Git không thực sự khác biệt với nhau theo cách mà bạn có thể nghĩ là chúng.

Điều bạn có thể muốn làm ở đây là sử dụng một kho lưu trữ riêng cho từng nhánh phát triển của từng người dùng.

7

Esko đề xuất giải pháp tuyệt vời phù hợp cho các dự án nguồn mở. Tuy nhiên, nó đòi hỏi mọi thành viên của nhóm cộng tác viên đều có tài khoản trả phí trên GitHub, điều này không phải lúc nào cũng đúng.

VonC chỉ ra rằng có một giải pháp khác chỉ liên quan đến một tài khoản GitHub trả phí. Và tôi sẽ cung cấp một số hướng dẫn cách triển khai giải pháp của VonC.

Giả sử chúng tôi có hai kho riêng: test-testtest-production. Repo đầu tiên là để phát triển và mọi thành viên trong nhóm đều có quyền truy cập vào nó. Repo thứ hai là để triển khai tự động mã và do đó các hạn chế truy cập mạnh được áp dụng cho nó.

Thiết lập cho nhà phát triển khá đơn giản và dễ nhìn: git clone https://github.com/<username>/test-test, thực hiện công việc của họ và đẩy nó trở lại.

cài đặt cho cộng tác viên là phức tạp hơn một chút:

  1. Kéo chi nhánh từ repo phát triển git clone https://github.com/<username>/test-test

  2. Thêm kho từ xa git remote add production-repo https://github.com/<username>/test-production.git

  3. Fetch dữ liệu từ repo mới git fetch production-repo

  4. Tạo địa phương mới chi nhánh cho mã sản xuất và chuyển sang nó git checkout -b local-production

  5. biết chính xác git để liên kết các chi nhánh địa phương và từ xa git branch -u production-repo/production

  6. Tải về nội dung của các ngành sản xuất từ ​​xa đến một git pull

  7. mâu thuẫn Phân loại ra khả năng của địa phương và đó là nó!

Bây giờ tất cả những gì được đẩy từ chi nhánh local-production sẽ xâm nhập vào test-production repo và các ngành khác sẽ được đẩy lên test-test repo.

Ok, điều đó thật tuyệt, nhưng truy cập phân cấp chi tiết hơn ([tên người]] thì sao? - Bạn có thể yêu cầu. Câu trả lời là: bạn có thể tạo repos tương tự như test-test cho mọi nhà phát triển và sử dụng cùng một mẫu để thiết lập chúng. Nhược điểm của phương pháp này là các cộng tác viên sẽ phải sao chép từng bản ghi test-test-[person's name]-development.

VonC cũng đề xuất chia nhỏ số đăng ký production và thực hiện yêu cầu kéo - tại sao không làm như vậy? Thứ nhất, bởi vì bạn không thể núp một repo riêng tư mà không phải trả tiền tài khoản GitHub. Thứ hai, để cho phép một người nào đó ngã ba riêng repo, bạn cấp cho anh ta quyền truy cập đầy đủ vào nó, vì vậy anh ấy có thể trực tiếp đẩy nó vào. Và một nhà phát triển có thể mắc lỗi, hãy đẩy tới bản phát hành production để khởi chạy các móc dịch vụ GitHub và sửa chữa mọi thứ. Và nếu bạn sử dụng một số nhà phát triển thuê ngoài, điều này có thể sẽ xảy ra.

Ngoài ra, tôi muốn cảnh báo bạn về tính năng lỗi lỗi trong ứng dụng GitHub chính thức dành cho Windows. Các nhánh với thượng lưu khác với nguồn gốc sẽ xuất phát. Vì vậy, sử dụng dòng lệnh để đẩy.

Tất cả những điều này có vẻ hơi phức tạp một chút. Nhưng nó luôn luôn là như thế nếu bạn không muốn trả tiền cho sự đơn giản.

+9

Tôi nghĩ bạn hoàn toàn có thể chia sẻ một kho lưu trữ riêng tư với một tài khoản không phải trả tiền và nó vẫn là riêng tư. –

+1

Cảm ơn lời khuyên này, Jorge. Tôi thấy nó khá thú vị vì tôi sợ rằng cái nĩa không trả tiền sẽ được công khai. Chỉ cần xác minh thông qua tài khoản GitHub có trả tiền và không trả tiền và bạn sẽ được phát hiện. BTW, ngã ba không thể được công bố ngay cả sau khi thực tế. –

9

Bạn có thể muốn xem GitLab và tính năng "chi nhánh được bảo vệ" của nó. Tôi nghĩ rằng nó khá chính xác những gì bạn đang tìm kiếm. Xem Keeping your code protected.

11

Lưu ý: Protected branches and required status checks (ngày 03 tháng 9 2015) sẽ không chính xác phép một chi nhánh duy nhất ("[tên người] -development"), nhưng nó nhận được bản sao.

Các chi nhánh sẽ được bảo vệ:

  • chống lại buộc phải đẩy
  • khỏi việc xoá bỏ
  • chống lại những thay đổi sáp nhập cho đến khi được yêu cầu kiểm tra tình trạng vượt qua

https://cloud.githubusercontent.com/assets/25792/9596474/27db3ce6-502a-11e5-9b19-5b47a8addc65.png

+1

Có thể thêm "kiểm tra" về cơ bản kiểm tra xem cam kết có đến từ người dùng được ủy quyền hay không. Bạn có thể không thể tìm ra điều đó dựa trên bản thân cam kết (vì bất kỳ ai cũng có thể giả mạo email), nhưng bạn có thể, ví dụ, có một ứng dụng mà người dùng được ủy quyền có thể ghi danh sách trắng băm trước khi đẩy. – interestinglythere

+0

Một tùy chọn khác: Tạo một ứng dụng cho phép các lần gửi đến được xem xét và tự động bị từ chối nếu không có ai được ủy quyền xác nhận chúng trong một khoảng thời gian nhất định. – interestinglythere

+0

@interestinglythere bình luận đầu tiên của bạn là những gì gitolite là bao gồm (http://gitolite.com/gitolite/gitolite.html#overview, http://stackoverflow.com/a/10888358/6309) – VonC

1

Trong Bitbucket phiên bản (Bitbucket v4.9.1) Bạn có thể giới hạn thay đổi bởi:

  1. Tên chi nhánh
  2. Tên chi nhánh mẫu
  3. Chi nhánh tên người mẫu

Tiếp theo hành động có thể bị hạn chế:

  1. Ngăn chặn tất cả các thay đổi
  2. Ngăn chặn xóa
  3. Ngăn chặn rewirting lịch sử
  4. Ngăn chặn thay đổi mà không có một yêu cầu kéo

Nhập người dùng đó là một ngoại lệ;

enter image description here enter image description here

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