2012-06-06 31 views
7

Tôi đã tìm kiếm xung quanh và tìm thấy một số chủ đề liên quan, nhưng tất cả đều liên quan đến việc giới hạn kích thước tệp hoặc mối quan tâm có hạn ngạch.Có Git Server Side Hook để đặt hạn ngạch trên kích thước kho lưu trữ không?

Tôi đã xây dựng một máy chủ Git với Gitolite cho một nơi để sinh viên chia sẻ các dự án khóa học. Tất cả các chức năng dưới một tên người dùng trên máy chủ, git, với một kho lưu trữ thẻ hoang dã "projects/Creator/[a-zA-Z0-9]. *". Các kho lưu trữ có WRITERS và READERS được định nghĩa để người dùng có thể sửa đổi ai có thể viết và đọc kho lưu trữ của họ.

SSH file quan trọng được thực hiện vì vậy người dùng chỉ có thể tạo ra một kho lưu trữ bởi:

git clone [email protected]: dự án/bob/project1 git clone [email protected]: dự án/bob/someotherproj

v.v. Thư mục "bob" được tạo ra lần đầu tiên họ làm git clone (đó là tên người dùng của họ).

Vấn đề của tôi là, là sinh viên, sẽ có sự lạm dụng và tôi sẽ cần giới hạn kích thước của thư mục "bob". Dung lượng đĩa không hoạt động vì tất cả các thư mục và tệp được sở hữu bởi git và điều đó đã bị giới hạn. Tôi có thể tái kỹ sư này để phục vụ dự án của họ từ thư mục nhà Linux của họ và do đó có thể sử dụng hạn ngạch đĩa, tuy nhiên, tôi không muốn phải thiết kế lại máy chủ này ngay bây giờ mà tôi có nó hoạt động.

Về cơ bản, tôi đang tìm kiếm một cái móc đó đã làm một cái gì đó giống như kịch bản vỏ thô này:

foldersize=`du -s $GITPATH/projects/$USERNAME` 
if [ $foldersize > 250000 ]; then 
    echo "Quota Exceeded" 
    exit 1 
fi 

Tôi hiểu có server side móc mà có thể được viết, tôi muốn để xem nếu bánh xe đã được tạo trước khi tôi bắt đầu khắc nó ra. Vì vậy, bất kỳ móc để hạn chế kích thước kho lưu trữ?

Trả lời

4

Móc git pre-receive có thể được sử dụng để thực hiện hạn ngạch. Từ trang githooks(5) người đàn ông:

This hook is invoked by git-receive-pack on the remote repository, 
which happens when a git push is done on a local repository. Just 
before starting to update refs on the remote repository, the 
pre-receive hook is invoked. Its exit status determines the success or 
failure of the update. 

Vì vậy, bạn sẽ đặt kiểm tra hạn ngạch logic của bạn trong kịch bản này và cho phép hoặc từ chối một bản cập nhật đến tùy thuộc vào kết quả. Nó sẽ là công việc của bạn để thực sự quản lý hạn ngạch; có một số cách để thực hiện việc này, cách đơn giản nhất là dựa vào hỗ trợ hệ thống tệp của bạn cho hạn ngạch người dùng.

Bạn chắc chắn có thể sử dụng ví dụ du của mình, mặc dù khi kho lưu trữ tăng kích thước, điều này sẽ gây ra sự chậm trễ đáng kể (và i/o gánh nặng) cho mỗi lần cập nhật. Việc lưu các kết quả từ tập lệnh này trong một khoảng thời gian có thể sẽ giúp ích, mặc dù việc giao dịch ở đây rõ ràng là ai đó có thể vượt quá hạn mức của họ nếu họ đẩy cập nhật trước khi bộ nhớ cache hết hạn.

Tùy thuộc vào cách lưu trữ của bạn, bạn có thể xem xét hạn ngạch thư mục cho kho lưu trữ git (nếu lưu trữ của bạn đến từ thứ gì đó hỗ trợ điều này, như hầu hết máy chủ doanh nghiệp) hoặc sử dụng khối lượng LVM trên mỗi kho lưu trữ được đề xuất here).

Mặc dù có đề xuất ngược lại, việc thực hiện hạn ngạch cho kho lưu trữ từ xa là khá phổ biến. Hầu hết các dịch vụ lưu trữ git giới hạn bộ nhớ đĩa của bạn và sẽ từ chối cập nhật khi bạn đạt đến giới hạn của mình.

+0

Theo trang người dùng, móc nhận trước có thể được bỏ qua bằng tùy chọn --noverify ... Vấn đề với hỗ trợ hệ thống tập tin là mọi thứ dưới một UID với gitolit. Đoán tôi sẽ phải tái kỹ sư giải pháp để sử dụng hạn ngạch người dùng cấp hệ thống tập tin và nhiều tài khoản ... và tôi nghĩ rằng tôi đã gần như được thực hiện với máy chủ này ... thở dài. –

+0

Đó là lý do tại sao tôi đề cập đến hạn ngạch mỗi thư mục; điều này giải quyết vấn đề "mọi thứ chỉ là một người dùng". – larsks

+0

Cũng lưu ý rằng '--no-verify' là đối số của' commit', không phải là 'push'. Một người dùng từ xa không thể ghi đè lên móc 'pre-receive' của bạn. – larsks

0

git không có bất kỳ chức năng nào để triển khai hạn ngạch. Tôi không nghĩ rằng sẽ có bất kỳ cách nào có thể. Điều gì sẽ xảy ra khi bạn đạt đến hạn ngạch của mình? Bạn sẽ không còn có thể cam kết, tìm nạp các cập nhật từ kho lưu trữ từ xa, hoặc bất kỳ số hoạt động kiểu bảo trì nào khác. Khá nhiều 'đạt hạn ngạch' === 'chết ngay lập tức với chức năng kho lưu trữ' ...

+0

Vì điều này sẽ được sử dụng cho, tình huống như vậy không phải là vấn đề lớn. Nếu nó được hỗ trợ phát triển, thì không gian đĩa rẻ hơn so với mạo hiểm kho lưu trữ. –

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