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

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

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

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

Ответ 1

Попробуйте сделать существующий репозиторий в 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")

Ответ 2

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

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

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

Ответ 3

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

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

BARE REPOSITORY

cd <repo.git>/                            # Enter inside the git repo
git config core.sharedRepository group    # Update the git 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 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 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 group id

где:

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

Ответ 4

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

git config receive.denyNonFastForwards true

Значение этого параметра выглядит следующим образом:

receive.denyNonFastForwards

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

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

Ответ 5

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

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

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