У нас возникла проблема с разрешением 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