Как настроить существующее репозиторий git для совместного использования группой UNIX

98

У меня есть существующий репозиторий git (голый), который до этого момента был доступен для записи только мне. Я хочу открыть его для некоторой группы пользователей UNIX, foo, чтобы все члены foo могли нажимать на нее. Я знаю, что могу легко создать новое репозиторий git с помощью:

git init --bare --shared=group repodir
chgrp -R foo repodir

Но мне нужна эквивалентная операция для существующего каталога репо.

Пистос
источник
4
На этот вопрос есть отличный ответ на ServerFault (еще один сайт StackOverflow).
Zearin

Ответы:

115

Попробуйте сделать так, чтобы существующий репозиторий repodirработал для пользователей в группе 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")
Дэвид Андерхилл
источник
14
Я бы добавил, что вам, вероятно, также следует установить config.sharedRepository = true в конфигурации репо. kernel.org/pub/software/scm/git/docs/git-config.html
Пистос,
1
Это довольно похоже на то, что я делал сам, но я хотел получить какое-то внешнее подтверждение. Спасибо. :) Я также надеялся, что будет что-то вроде git clone --shared = group, но опция clone --shared делает что-то совершенно другое.
Pistos
5
Вы можете использовать git init --sharedкоманду в существующем репо, чтобы установить значение конфигурации. Вам также необходимо выполнить chmodкоманду, чтобы получить права доступа к файлам.
Спенсер
1
Подтверждение этого также помогает, если вы попали в затруднительное положение из-за того, что кто-то выполнил и git pullт. Д. Как root, а не как www-dataвладелец, и в результате вы получите error: insufficient permission for adding an object to repository database .git/objects. Я думал, что исправил право собственности на все файлы / каталоги, которые были неправильными, используя findи -type d/ type -f, но только этот метод избавился от ошибки (возможно, потому что файл в каком-то подкаталоге не мог быть записан группой?)
Уильям Туррелл
2
Кажется, что umask пользователя по-прежнему применяется к вновь созданным файлам. Вы этого ожидаете? Я думаю, что в документации core.sharedRepositoryупоминается об этом - это кажется бесполезным, если пользователи не сделают все свои группы файлов доступными для записи.
Сэм Брайтман
47

В каталоге репо выполните следующие команды:

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

Изменить: чтобы устранить частую путаницу, groupэто фактическое ключевое слово, вы не должны заменять его именем группы.

Kixorz
источник
25
Где groupНЕ название группы :)
Pierre de LESPINAY
7
Файлы объектов и пакетов должны быть неизменяемыми; у них должны быть разрешения 444 / r - r - r--.
CB Bailey
3
После попытки git config core.sharedRepository devзатем набрав git configя получаю fatal: bad config value for 'core.sharedrepository' in .git/configв git version 1.7.0.4(и , возможно , версии после)
Kzqai
3
git config core.sharedRepository group groupэто не название группы, а реальное значение!
kixorz
Если вы допустили ошибку, использовав имя своей группы вместо «group», просто откройте .git / config в текстовом редакторе и отредактируйте строку core.sharedRepository, указав «group».
Том
44

Объединение @David Андерхиллы и @kixorz ответов, я сделал свое собственное (окончательное) решение.

Это для босых операции РЕПО и без оголенных РЕПО. Между ними есть лишь небольшие различия, но в этом смысле они более четкие.

ГОЛЫЙ ХРАНИЛИЩ

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

где:

  • <repo.git>- это пустой каталог репозитория, обычно на сервере (например my_project.git/).
  • <group-name>это имя группы для пользователей git (например, пользователей ).

НЕЗАГОЛЕННЫЙ РЕПОЗИТОРИЙ

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

где:

  • <project_dir>- это каталог проекта, в котором находится .gitпапка.
  • <group-name>это имя группы для пользователей git (например, пользователей ).
Андреа
источник
Как сказал Чарльз, также сделайте: chmod g-w objects/pack/*(если репозиторий не голый, добавьте .git/)
Вернайт,
здесь как мы можем найти имя группы или как создать имя группы?
Суджитрао
'chmod g + s find . -type d' вызывает ошибкуunable to execute /bin/chmod: Argument list too long
Dr.X
Как отметил @ Dr.X, chmod g+s `find . -type d`не масштабируется. Usefind -type d -exec chmod g+s {} +
hagello
Я думаю, что все свободные объекты также должны быть доступны только для чтения на основе предварительного общего состояния. Может что-то вроде chmod g-w objects/*/*. Я не уверен насчет подкаталога info, поскольку он пуст для этого репо.
Эрик
3

Вероятно, в этом нет необходимости, но стоит отметить, что git init --bare --sharedтакже устанавливается опция denyNonFastForwards .

git config receive.denyNonFastForwards true

Смысл этой опции в следующем:

receive.denyNonFastForwards

Если вы перебазируете коммиты, которые вы уже отправили, а затем попытаетесь нажать еще раз, или иным образом попытаетесь отправить фиксацию в удаленную ветку, которая не содержит фиксации, на которую в настоящее время указывает удаленная ветвь, вам будет отказано. В целом это хорошая политика; но в случае перебазирования вы можете определить, что знаете, что делаете, и можете принудительно обновить удаленную ветку с помощью флага -f для своей команды push.

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

нерфолог
источник
1

В дополнение к приведенным выше ответам о разрешении группе читать / писать вам также необходимо добавить пользователя в группу (скажем, «foo»).

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

Примечание: вам нужно сначала создать пользователя, если он не существует

сарвагья кумар
источник