Назад | Перейти на главную страницу

Проблема с разрешением в Git (через SSH) на FreeBSD

У нас возникла проблема с разрешением Git на FreeBSD. Настройка довольно проста. У нас есть несколько разных репозиториев на одном сервере. Для простоты предположим, что они находятся в / git / repo1 и / git / repo2.

Каждое репо принадлежит пользователю git и одноименной группе (например, repo1). Репо настроено с доступом g + rwX.

Каждый пользователь, который фиксируется в репозитории, также является членом группы репо (например, repo1).

Во всех репозиториях Git установлен параметр sharedRepository = group.

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

Мы уже некоторое время ломаем голову над этой проблемой, и единственный способ решить ее - запустить следующий скрипт между коммитами (что, очевидно, очень неудобно):

найти / git / repo1 -type d -exec chmod g + s {} \;
chmod -R g + rwX / git / repo1
chown -R git: repo1 / git / repo1 /
cd / git / repo1
git gc

Кто-нибудь знает, в чем проблема?

Сверху в голове, возможно, проблема с маской?

Вы не думали обернуть git с помощью gitosis (http://vafer.org/blog/20080115011413)? Я считаю, что это гораздо более приятный способ работы с Git (без проблем с разрешениями, поскольку репо принадлежит одному пользователю ОС), а разрешения, которые вы можете реализовать с помощью gitosis, являются привлекательным бонусом.

Когда вы создаете новый репозиторий, установите групповое владение папкой и дайте ему липкий бит:

chown git:repo1 /git/repo1

chmod g+ws /git/repo1

Также убедитесь, что у каждого пользователя правильный umask. Вы можете установить umask по умолчанию в /etc/login.conf. Найдите строку под: default, которая выглядит так:

:umask=002:

Измените его на:

:umask=022:

И запускаем:

sudo cap_mkdb /etc/login.conf