Mam istniejące repozytorium git (puste), do którego do tej pory mogłem zapisywać tylko ja. Chcę go otworzyć dla jakiejś grupy użytkowników UNIX, foo, tak aby wszyscy członkowie foo mogli do niego pushować. Zdaję sobie sprawę, że mogę łatwo skonfigurować nowe repozytorium git za pomocą:
git init --bare --shared=group repodir
chgrp -R foo repodir
Ale potrzebuję równoważnej operacji dla istniejącego repozytorium reż.
git
permissions
share
shared
Pistos
źródło
źródło
Odpowiedzi:
Spróbuj tego, aby istniejące repozytorium
repodir
działało dla użytkowników w grupiefoo
:źródło
git init --shared
polecenia w istniejącym repozytorium, aby ustawić wartość konfiguracji. Musisz także wykonaćchmod
polecenie, aby uzyskać właściwe uprawnienia do plików.git pull
itp. Jako root, a nie jakowww-data
lub cokolwiek właściciel jest iw rezultacie otrzymaszerror: insufficient permission for adding an object to repository database .git/objects
. Myślałem, że naprawiłem własność wszystkich plików / katalogów, które były błędne, używającfind
i-type d
/type -f
, ale tylko ta metoda pozbyła się błędu (prawdopodobnie dlatego, że plik w jakimś podkatalogu nie był możliwy do zapisu przez grupę?)core.sharedRepository
Wydaje mi się, że dokumentacja by o tym wspominała - wydaje się bezużyteczna bez użytkowników umożliwiających zapis wszystkich swoich grup plików.W katalogu repozytorium wykonaj następujące polecenia:
Edycja: aby rozwiązać częste nieporozumienia,
group
jest rzeczywistym słowem kluczowym, nie należy go zastępować nazwą grupy.źródło
group
NIE jest nazwa grupy :)git config core.sharedRepository dev
następnie wpisującgit config
mamfatal: bad config value for 'core.sharedrepository' in .git/config
wgit version
1.7.0.4
(i ewentualnie wersje po)git config core.sharedRepository group
group
to nie nazwa grupy, ale rzeczywista wartość!Łącząc odpowiedzi @David Underhill i @kixorz , stworzyłem własne (ostateczne) rozwiązanie.
Dotyczy to samych transakcji repo i non-bare repo. Są między nimi tylko niewielkie różnice, ale w ten sposób są wyraźniejsze.
NAGIE REPOZYTORIUM
gdzie:
<repo.git>
to katalog czystego repozytorium, zwykle na serwerze (npmy_project.git/
.).<group-name>
to nazwa grupy dla użytkowników git (np. użytkowników ).NIEDOŻYWANY REPOZYTOR
gdzie:
<project_dir>
to katalog projektu zawierający.git
folder.<group-name>
to nazwa grupy dla użytkowników git (np. użytkowników ).źródło
chmod g-w objects/pack/*
(jeśli nie jest to nagie repozytorium,.git/
find . -type d
Błąd „chmod g + s ”unable to execute /bin/chmod: Argument list too long
chmod g+s `find . -type d`
nie skaluje się. Użyjfind -type d -exec chmod g+s {} +
chmod g-w objects/*/*
. Nie jestem jednak pewien co do podkatalogu info, ponieważ jest on pusty dla tego repozytorium.Prawdopodobnie nie jest to konieczne, ale warto zaznaczyć, że
git init --bare --shared
ustawia również opcję denyNonFastForwards .Znaczenie tej opcji jest następujące:
(z http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration )
źródło
Oprócz powyższych odpowiedzi dotyczących zezwolenia grupie na odczyt / zapis musisz również dodać użytkownika do grupy (powiedz „foo”).
Uwaga: musisz najpierw utworzyć użytkownika, jeśli nie istnieje
źródło