Jak skonfigurować istniejące repozytorium git do współużytkowania przez grupę UNIX

98

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ż.

Pistos
źródło
4
Jest to doskonała odpowiedź na to pytanie nad na ServerFault (innej stronie StackOverflow).
Zearin

Odpowiedzi:

114

Spróbuj tego, aby istniejące repozytorium repodirdziałało dla użytkowników w grupie foo:

chgrp -R foo repodir                 # set the group
chmod -R g+rw repodir                # allow the group to read/write
chmod g+s `find repodir -type d`     # new files get group id of directory
git init --bare --shared=all repodir # sets some important variables in repodir/config ("core.sharedRepository=2" and "receive.denyNonFastforwards=true")
David Underhill
źródło
14
Dodam, że prawdopodobnie powinieneś także ustawić config.sharedRepository = true w konfiguracji repozytorium. kernel.org/pub/software/scm/git/docs/git-config.html
Pistos,
1
Jest to bardzo zbliżone do tego, co robiłem samodzielnie, ale chciałem uzyskać zewnętrzne potwierdzenie. Dzięki. :) Miałem też nadzieję, że będzie coś w rodzaju git clone --shared = group, ale opcja clone --shared robi coś zupełnie innego.
Pistos,
5
Możesz użyć git init --sharedpolecenia w istniejącym repozytorium, aby ustawić wartość konfiguracji. Musisz także wykonać chmodpolecenie, aby uzyskać właściwe uprawnienia do plików.
Spencer,
1
Potwierdzenie tego pomaga również, jeśli jesteś w bałaganie, ponieważ ktoś zrobił git pullitp. Jako root, a nie jako www-datalub cokolwiek właściciel jest iw rezultacie otrzymasz error: 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ąc findi -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ę?)
William Turrell
2
Wydaje się, że umask użytkownika nadal ma zastosowanie do nowo utworzonych plików. Czy tego się spodziewasz? core.sharedRepositoryWydaje 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.
Sam Brightman
47

W katalogu repozytorium wykonaj następujące polecenia:

git config core.sharedRepository group
chgrp -R foo repodir
chmod -R g+w repodir

Edycja: aby rozwiązać częste nieporozumienia, groupjest rzeczywistym słowem kluczowym, nie należy go zastępować nazwą grupy.

kixorz
źródło
25
Gdzie groupNIE jest nazwa grupy :)
Pierre de LESPINAY
7
Pliki obiektów i pakietów powinny być niezmienne; powinny mieć uprawnienia 444 / r - r - r--.
CB Bailey
3
Po wypróbowaniu git config core.sharedRepository devnastępnie wpisując git configmam fatal: bad config value for 'core.sharedrepository' in .git/configw git version 1.7.0.4(i ewentualnie wersje po)
Kzqai
3
git config core.sharedRepository group groupto nie nazwa grupy, ale rzeczywista wartość!
kixorz,
Jeśli popełniłeś błąd, używając nazwy swojej grupy zamiast „grupy”, po prostu otwórz .git / config w edytorze tekstu i edytuj wiersz core.sharedRepository, aby powiedzieć „grupa”.
Tom,
43

Łą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

cd <repo.git>/                            # Enter inside the git repo
git config core.sharedRepository group    # Update the git's config
chgrp -R <group-name> .                   # Change files and directories' group
chmod -R g+w .                            # Change permissions
chmod g-w objects/pack/*                  # Git pack files should be immutable
find -type d -exec chmod g+s {} +         # New files get directory's group id

gdzie:

  • <repo.git>to katalog czystego repozytorium, zwykle na serwerze (np my_project.git/.).
  • <group-name>to nazwa grupy dla użytkowników git (np. użytkowników ).

NIEDOŻYWANY REPOZYTOR

cd <project_dir>/                         # Enter inside the project directory
git config core.sharedRepository group    # Update the git's config
chgrp -R <group-name> .                   # Change files and directories' group
chmod -R g+w .                            # Change permissions
chmod g-w .git/objects/pack/*             # Git pack files should be immutable
find -type d -exec chmod g+s {} +         # New files get directory's group id

gdzie:

  • <project_dir>to katalog projektu zawierający .gitfolder.
  • <group-name>to nazwa grupy dla użytkowników git (np. użytkowników ).
Andrea
źródło
Jak powiedział Charles, zrób także: chmod g-w objects/pack/*(jeśli nie jest to nagie repozytorium, .git/
dodaj na
tutaj jak możemy znaleźć nazwę grupy lub jak utworzyć nazwę grupy?
Sujithrao
find . -type dBłąd „chmod g + s ”unable to execute /bin/chmod: Argument list too long
dr X
Jak zauważył @ Dr.X, chmod g+s `find . -type d`nie skaluje się. Użyjfind -type d -exec chmod g+s {} +
hagello
Myślę, że wszystkie luźne obiekty powinny być również tylko do odczytu w oparciu o stan wstępnie udostępniony. Może coś takiego chmod g-w objects/*/*. Nie jestem jednak pewien co do podkatalogu info, ponieważ jest on pusty dla tego repozytorium.
Eric
3

Prawdopodobnie nie jest to konieczne, ale warto zaznaczyć, że git init --bare --sharedustawia również opcję denyNonFastForwards .

git config receive.denyNonFastForwards true

Znaczenie tej opcji jest następujące:

receive.denyNonFastForwards

Jeśli zmienisz bazę zatwierdzonych już zatwierdzeń, a następnie spróbujesz ponownie wypchnąć lub w inny sposób spróbujesz przekazać zatwierdzenie do zdalnej gałęzi, która nie zawiera zatwierdzenia, na które obecnie wskazuje zdalna gałąź, zostaniesz odrzucony. Jest to ogólnie dobra polityka; ale w przypadku rebase możesz stwierdzić, że wiesz, co robisz i możesz wymusić aktualizację zdalnej gałęzi za pomocą flagi -f do polecenia push.

(z http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration )

nerfolog
źródło
1

Oprócz powyższych odpowiedzi dotyczących zezwolenia grupie na odczyt / zapis musisz również dodać użytkownika do grupy (powiedz „foo”).

sudo usermod -a -G [groupname] [username]

Uwaga: musisz najpierw utworzyć użytkownika, jeśli nie istnieje

sarvagya kumar
źródło