2012-06-06 7 views
7

Przeszukałem i znalazłem kilka powiązanych tematów, ale wszystkie były związane z ograniczaniem rozmiarów plików lub obawami, że były przydziały.Czy istnieje boczny hak serwera Git do umieszczania limitu na rozmiarach repozytoriów?

Zbudowałem serwer Git z Gitolite, aby umożliwić uczniom dzielenie się projektami kursów. Wszystko działa pod jedną nazwą użytkownika na serwerze, git, z repozytoriami z dziką kartą "projects/Creator/[a-zA-Z0-9].". Repozytoria mają zdefiniowane PISARKI i CZYTNIKI, dzięki czemu użytkownik może modyfikować, kto może pisać i czytać swoje repozytorium.

pliki kluczy SSH są realizowane dzięki czemu użytkownik może po prostu stworzyć repozytorium poprzez:

git clone [email protected]: Projekty/bob/project1 git clone [email protected]: Projekty/bob/someotherproj

i tak dalej. Folder "Bob" jest tworzony przy pierwszym wykonaniu klona git (jest to nazwa użytkownika).

Mój problem polega na tym, że będąc uczniami, będą nadużycia i będę musiał ograniczyć rozmiar folderu "Bob". Przydziały dysku nie działają, ponieważ wszystkie foldery i pliki są własnością git, a to już jest ograniczone.

Potrafię przerobić to na pewnie, aby obsługiwać ich projekty z folderów domowych Linuksa, a tym samym móc korzystać z przydziałów dyskowych, jednak wolałbym nie zmieniać tego serwera teraz, gdy go mam.

Zasadniczo szukałem haka, że ​​zrobił coś takiego szorstkiego skryptem powłoki:

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

rozumiem istnieją haki stronie serwera, które mogą być napisane, chciałem sprawdzić, czy koła został już utworzony zanim zacząłem go wyrzeźbić. A więc jakieś haczyki ograniczające rozmiar repozytorium?

Odpowiedz

4

Haczyk git pre-receive może zostać użyty do zaimplementowania limitów. Od stronie githooks(5) człowiek:

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. 

Tak byłoby umieścić logiki przydziału kontroli w tym skrypcie i zezwolić lub odrzucić przychodzące aktualizacji w zależności od wyniku. Byłoby twoje zadanie , aby faktycznie zarządzać kwotami; Jest na to wiele sposobów, aby to zrobić, najprościej polegając na obsłudze systemu plików dla przydziałów użytkownika.

Możesz na przykład użyć swojego przykładu du, chociaż w miarę wzrostu liczby repozytoriów będzie to oznaczało znaczne opóźnienie (i obciążenie i/o) dla każdej aktualizacji. Buforowanie wyników tego skryptu przez pewien czas prawdopodobnie pomogłoby, chociaż kompromisem tutaj jest oczywiście to, że ktoś mógłby następnie przekroczyć swój limit, jeśli przesyła aktualizację przed wygaśnięciem pamięci podręcznej.

Zależnie od tego, jak zorganizowana jest Twoja pamięć, możesz przejrzeć limity na poszczególne katalogi dla repozytoriów git (jeśli twoja pamięć pochodzi z czegoś, co obsługuje to, jak większość serwerów plików firmowych) lub użyć woluminu LVM na repozytorium (jak zasugerował here).

Pomimo sugestii przeciwnych, wprowadzenie limitów dla zdalnego repozytorium jest dość powszechne. Większość usług hostingowych git ogranicza pamięć dyskową i odrzuci aktualizacje po osiągnięciu limitu.

+0

Zgodnie ze stroną man, hak pre-receive może być ominięty z opcją --noverify ... Problem z obsługą systemów plików jest taki, że wszystko jest pod jednym UID z gitolite. Chyba będę musiał ponownie zaprojektować rozwiązanie, aby użyć przydziałów na poziomie systemu plików i wielu kont ... i pomyślałem, że prawie skończyłem z tym serwerem ... westchnienie. –

+0

Dlatego wspomniałem o limitach na numery katalogowe; rozwiązuje to problem "wszystko jest jednym użytkownikiem". – larsks

+0

Należy również zauważyć, że '--no-verify' jest argumentem dla' commit', a nie 'push'. Zdalny użytkownik nie może przesłonić haka 'pre-receive'. – larsks

0

git nie ma żadnej funkcjonalności do zaimplementowania przydziałów. Nie sądzę, że byłoby to w jakikolwiek rozsądny sposób. Co się stanie, gdy osiągniesz limit? Nie można już zatwierdzać, pobierać aktualizacji ze zdalnych repozytoriów ani żadnej innej czynności związanej z konserwacją. Prawie "limit zasięgu" === "natychmiastowa śmierć do funkcji repozytorium" ...

+0

To, do czego byłaby używana, nie jest wielką sprawą. Jeśli wspierał rozwój, to przestrzeń dyskowa jest tańsza niż ryzykowanie repozytorium. –

Powiązane problemy