Как настроить существующий репозиторий 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]
Примечание: вам придется сначала создать пользователя, если он не существует