Подтвердить что ты не робот

Проблемы с разрешением файла при совместном использовании удаленного хранилища GIT

У меня есть репозиторий GIT, который я управляю для своего офиса. Из-за политики компании мы не можем использовать внешних хостинг-провайдеров, таких как GitHub и т.п. Итак, я остался делать все, что в моих локальных сетях.

Каждый управляет своими собственными локальными репозиториями, но у нас также есть удаленный репозиторий, который наши пользователи нажимают (и доступны для таких приложений, как Hudson и Fisheye), подобно тому, как центральное репо будет работать в подрывной деятельности. Каждый пользователь имеет настройку открытых ключей, поэтому они могут выполнять аутентификацию без пароля на ящике, где находится наш удаленный репозиторий.

В нашем удаленном репозитории я настроил их для совместного использования в режиме "group":

git config core.sharedRepository group

Все наши пользователи также являются членами группы GIT, но это не основная группа для многих пользователей. Кажется, что когда GIT создает или обновляет любые объекты на "push", он использует основную группу пользователя. Вместо этого мне нужно использовать общую группу "git", в которой каждый пользователь является членом. Я видел документацию в Интернете, которая ранее обсуждала установку липкого бита, но, похоже, она отличалась в зависимости от источника и на самом деле не затрагивала проблему создания общей группы (если я просто делаю файлы произвольно записываемыми, Я мог бы также сделать их 777).


Update:

Использование Matthew Flaschen ответ ниже

chgrp -R git repo.git 
find repo.git -type d -exec chmod g+rws {} +

Я смог создать репозиторий, который каждый мог бы выталкивать и вытаскивать вместе. Я также посмотрю на gitolite, но мои потребности довольно простые, и наша среда позволяет настраивать пользователя и ключи автоматически, поэтому использование не является ключевым. Тем не менее, я хочу убедиться, что я имею дело с этим правильным.

Моя структура репозитория включает в себя каталог верхнего уровня (remote-repos) и подкаталоги для каждого из моих репозиториев (app-1.git, app-2.git, library-1.git и т.д.). Я должен уметь применять chmod g + rws {} + в каталог верхнего уровня (remote-repos) вместо каждого отдельного репо, правильно? Команда find

find /opt/remote-repos -type d -exec ...

Находит все каталоги в местоположении /opt/remote -repos и выполняет на них команду. Команда (chmod g + rws) гарантирует, что группа может читать и записывать эти файлы, а также устанавливает липкую ставку, чтобы указанная группа всегда использовалась при выполнении. (Я не знаю, как использовать часть {} +, я предполагаю, что это связано с опцией find exec).

В любом случае, просто хочу подтвердить, что мое понимание этого решения верное.

Другие ссылки:

4b9b3361

Ответ 1

git теперь имеет core.sharedRepository для этой цели.

Я рекомендую:

git config core.sharedRepository group

Затем, чтобы установить начальное владение группой, выполните:

sudo chgrp -R somegroup .
sudo find -type d -exec chmod g+s {} +
sudo chmod -R g+rw .git/objects/

в корне репо.

Для нового репо вы можете сделать:

git init --shared=group

Только если вышеуказанное не работает:

chgrp git -R repo.git 
find repo.git -type d -exec chmod g+rws {} +

s - это флаг setgid. В каталогах это означает, что файлы и каталоги, созданные в этом каталоге, имеют одну и ту же группу (git в этом случае). Недавно созданные подкаталоги также наследуют setgid.

Это похоже на то, как репозиторий git настроен на мою работу. Однако я согласен, что вы должны рассмотреть фактический серверный процесс git.

Ответ 2

Пользователь не должен использовать команду git с разрешениями sudo.

Если он не работает без разрешений sudo, убедитесь, что вы проверяете разрешение всей папки с 755 и файлы с 644,

Используя следующие команды, вы можете reset предоставить разрешения, как ожидалось.

find /path/to/repo_folder -type d -exec chmod 755 {} \;
find /path/to/repo_folder -type f -exec chmod 644 {} \;

Выше команды могут потребоваться разрешения sudo.

После этой операции вы должны commit + push все изменения в репо Он будет воссоздавать разрешения для всех файлов кода в режиме репо.

Ответ 3

Самый простой способ - использовать Gitolite. Я имел большой успех с этим.