Mam repozytorium Git na serwerze pomostowym, do którego musi być zdolnych wielu programistów. git-init
wydaje się mieć flagę bardzo zbliżoną do tego, czego szukam: --shared
oprócz tego, że chciałbym, aby wiele osób również przyciągnęło do tego repozytorium. git-clone
„S --shared
flag robi coś zupełnie innego.
Jaki jest najłatwiejszy sposób zmiany uprawnień istniejącego repozytorium?
permissions
git
users
share
Andriej Fiodorow
źródło
źródło
Odpowiedzi:
Uprawnienia są szkodnikiem.
Zasadniczo musisz upewnić się, że wszyscy ci programiści mogą pisać do wszystkiego w repozytorium git.
Przejdź do rozwiązania New-Wave, aby uzyskać najlepszą metodę przyznawania grupie programistów możliwości pisania.
Standardowe rozwiązanie
Jeśli umieścisz wszystkich programistów w specjalnie utworzonej grupie, możesz w zasadzie po prostu:
Następnie zmień
umask
dla użytkowników na002
, aby nowe pliki były tworzone z uprawnieniami do zapisu w grupie.Problemami z tym są legion; jeśli jesteś na distro, które przyjmuje
umask
z022
(jak mają wspólnąusers
grupę, która obejmuje każdy domyślnie), to może otworzyć się problemy związane z bezpieczeństwem w innym miejscu. A wcześniej czy później coś spieprzy twój starannie spreparowany schemat uprawnień, wyłączając repozytorium z działania, dopóki nie uzyskaszroot
dostępu i nie naprawisz go (tj. Ponownie uruchomisz powyższe polecenia).Rozwiązanie nowej fali
Lepszym rozwiązaniem - choć mniej zrozumiałym i wymagającym nieco większej obsługi systemu / narzędzi - jest użycie rozszerzonych atrybutów POSIX. Przybyłem do tego obszaru dopiero niedawno, więc moja wiedza tutaj nie jest tak gorąca, jak mogłaby być. Ale w zasadzie rozszerzona lista ACL to możliwość ustawiania uprawnień dla więcej niż tylko 3 domyślnych miejsc (użytkownik / grupa / inny).
Więc jeszcze raz utwórz grupę, a następnie uruchom:
To konfiguruje rozszerzoną listę ACL dla grupy, aby członkowie grupy mogli czytać / zapisywać / uzyskiwać dostęp do wszystkich plików, które już tam są (pierwsza linia); następnie powiedz wszystkim istniejącym katalogom, że nowe pliki powinny mieć tę samą listę ACL (drugi wiersz).
Mam nadzieję, że to cię poprowadzi.
źródło
chmod -R g+swX
, sprawiło, że Git był bardzo niezadowolony i zdecydował, że nie jest już repozytorium git („repo nie wydaje się być repozytorium git”). Musiałem przeskoczyć wszystkie pliki . Aby ustawić bit setgid w katalogach , spróbujfind /path/to/repo -type d -print0 | xargs -0 chmod g+s
. Nadal róbchgrp -R thegroup /path/to/repo
.chmod -R g+swX gitrepo
zastosuje bit setguid do plików, co stanowi zagrożenie bezpieczeństwa. Zamiast tego możesz użyć,find . -type d -exec chmod g+s {} +
aby zastosować go tylko do katalogów.jeśli utworzyłeś repozytorium (lub sklonowałeś nowe repozytorium od istniejącego) za pomocą
lub
Git powinien obsługiwać uprawnienia wykraczające poza to, co zapewnia domyślna umask. W końcu dotyczy to mojej wersji Git (1.6.3). Oczywiście zakłada to, że użytkownicy należą do tej samej grupy.
Gdybym jednak potrzebował zarządzania użytkownikami w wielu grupach o różnym stopniu odczytu / zapisu, wybrałbym gitosis. Słyszałem również o gitolicie ( http://github.com/sitaramc/gitolite ), widelcu gitosis, który ma zapewniać uprawnienia na poziomie oddziału, ale nie mogę powiedzieć, że każdy z nich osobiście go używał.
źródło
--shared
argument przyjmuje liczbę ósemkową, a nie szesnastkową. Potwierdziłem to w źródle Gita 1.7.8, a drugim przykładem powinien byćgit init --shared=0NNN
.NNN
maska uprawnień, numer grupy lub coś innego?git init --bare --shared=group myproj
myproj to nazwa repo, a następniechgrp -R mygroup myproj
mygroup to nazwa grupy.Nie zostało to powiedziane, więc chcę to szybko dodać.
Aby mieć pewność, że problemy z uprawnieniami nie przycinają ich brzydkiej głowy, upewnij się, że ustawiłeś następujące ustawienia w pliku konfiguracyjnym repozytorium git:
Zapewni to przestrzeganie ustawień „umask” twojego systemu.
źródło
git config core.sharedRepository true
.git init --shared
jestgit clone --config core.sharedRepository=true
. Dziwne, że git używa--shared
tak różnych znaczeń w podobnych poleceniach.Instrukcja obsługi Git opisuje sposób udostępniać repozytorium na kilka sposobów.
Bardziej skomplikowane, choć pełne funkcji sposoby udostępniania repozytoriów to:
Używamy GitHub dla zespołu 6 programistów.
źródło
Spójrz także na gitolite, na którym znajduje się twoje repozytorium git. Gitoza najwyraźniej nie jest już rozwijana.
źródło
Jednym ze sposobów naprawy uprawnień we współdzielonym repozytorium, aby użytkownicy nie mieli problemów z uprawnieniami podczas wypychania, jest utworzenie skryptu przechwytującego po aktualizacji, który to zrobi. Powinno to działać w dowolnej wersji git.
Załóżmy, że masz wspólne repozytorium w /myrepo.git. Wszystkie pliki w tym repozytorium należą do grupy mysharedgroup . Wszyscy użytkownicy pchający do tego repozytorium powinni również należeć do mysharedgroup . Teraz utwórz następujący plik (zmieniając mysharedgroup na swoje preferencje):
/myrepo.git/hooks/post-update
źródło
/dev/null
. Pozwól użytkownikowi najpierw zobaczyć te wiadomości, a następnie zdecydować samodzielnie.Aby zebrać fragmenty dobrych rad z różnych innych odpowiedzi i komentarzy na temat tworzenia nowego repozytorium:
Jeśli utworzenie nowy repo
myrepo
w/srv/git
dla grupymygroup
, to jest to, co chcesz:mygroup
core.bare = true
: spraw, aby było to proste repocore.sharedrepository = 1
(to samo cocore.sharedrepository = group
): katalog repo i wszystkie później utworzone w nim katalogi będą zarządzane przez git, aby zezwolić namygroup
odczyt, zapis i wykonywanie uprawnień (z ustawionym bitem sgid - tak, aby pracować z użytkownikami, dla którychmygroup
nie jest ich grupa podstawowa)receive.denyNonFastforwards = 1
: nie zezwalaj na przekazywanie repozytoriów bez przewijania do przoduJeśli chcesz dostroić uprawnienia użytkownika, grupy lub innych użytkowników, użyj
--shared=0NNN
, gdzieNNN
są standardowe bity użytkownika, grupy i inne bity dla plików (bity wykonania i sgid w katalogach będą odpowiednio zarządzane przez git). Na przykład umożliwia to dostęp do odczytu i zapisu użytkownikowi oraz dostęp tylko do odczytu do grupy (i brak dostępu do innych):Umożliwia to dostęp do odczytu i zapisu użytkownikowi i grupie (i nie ma dostępu do innych):
Umożliwia to dostęp do odczytu i zapisu użytkownikowi i grupie oraz dostęp tylko do odczytu do innych:
Zauważ, że jeśli nie zamierzasz zezwalać na dostęp do zapisu w grupie, upewnij się, że najpierw użyłeś,
chown
aby ustawić właściciela repo, a następnie uruchomgit init
komendę jako ten użytkownik (aby upewnić się, że repo zostało zainicjowane z poprawnym właścicielem dla wszystkie początkowe pliki i podkatalogi).źródło
Możesz użyć git-daemon do współdzielenia repozytorium. Przeczytaj dokumentację git-daemon, aby uzyskać więcej informacji.
EDYTOWAĆ:
Sprawdź także w tym artykule 8 sposobów udostępniania repozytorium git .
źródło
Wykonanie dokładnie tego działało dla mnie, dla istniejącego repozytorium. To wymaga porady z kilku odpowiedzi i komentarzy wcześniej:
Z katalogu nadrzędnego repozytorium na serwerze:
źródło
Odpowiedź @stevek_mcc jest tą, której szukałem, kiedy przejrzałem to pytanie
źródło