сделать репозиторий Git доступным для записи - PullRequest
8 голосов
/ 15 июня 2011

У нас есть 3 человека, которые используют общий репозиторий Git.У нас нет разрешения sudo на создание / изменение группы.Поскольку машина безопасна, нас попросили сделать Git глобальной доступной для записи (chmod +R o+rw *).Однако время от времени мы получаем эту ошибку.

error: insufficient permission for adding an object to repository database .git/ objects

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

Я сделал git repo-config core.sharedRepository true, но, похоже, это применимо только к groups,Как настроить Git для создания новых файлов global writeable ?

Ответы [ 3 ]

13 голосов
/ 15 июня 2011

Мы только что столкнулись с той же проблемой. Вот как мы справились с этим, в дополнение к бегу git repo-config core.sharedRepository true.

Примечание: это было на сервере Ubuntu Linux - вам могут понадобиться разные команды в вашей ОС, но подход должен быть в целом схожим. Обратите внимание, что многие из этих команд нужно будет запускать с правами root или с правами sudo.

Шаг 1. Создайте новую общую группу

Например, разработчики . Добавьте к этому своих разработчиков.

groupadd developers
usermod -aG developers <username>

Шаг 2. Смена владельца группы в существующем хранилище

chgrp -R developers /path/to/repo

Также сделайте файлы для групповой записи:

chmod -R g+w /path/to/repo

Шаг 3. Убедитесь, что новые каталоги созданы с группой, для которой задано новое имя группы

В некоторых * nix ОС (например, FreeBSD, OS X) группа вновь создаваемых файлов наследуется из родительского каталога. В других ОС (например, Ubuntu) это определяется группой процесса создания. В последнем случае вы можете изменить это поведение, установив флаг setgid в родительском каталоге. Таким образом, один из способов убедиться, что новые каталоги созданы, например, git pull иметь ту же группу, что и их родитель, периодически запускать что-то вроде этого:

find /path/to/repo -type d -exec chmod g+s {} \;

(т.е. найти все файлы в / path / to / repo каталога типа и запустить на них команду chmod g + s, чтобы установить флаг setgid.)

Еще один способ сделать это - сделать разработчиков основной группой входа для всех разработчиков:

usermod -g developers <username>

(Обратите внимание, что это может привести к тому, что пользователь больше не будет членом своей предыдущей основной группы входа, обычно это группа с тем же именем, что и имя пользователя. Используйте usermod -aG old_group usernanme для восстановления этого членства.)

Использование usermod -g developers означает, что когда пользователь создает новые файлы, они по умолчанию будут принадлежать пользователю: username , group: developers. Тем не менее, новые файлы обычно создаются так, что они доступны только для записи пользователем, а не для записи в группе. (т. е. если вы запустите touch foo; ls -l foo, вы увидите маску разрешений как -rw-r--r--.) Чтобы новые файлы, которые вы создаете, были доступны для групповой записи по умолчанию, добавьте umask 0002 в конец вашего .profile или .bash_profile файл.

echo umask 0002 >> ~/.profile

Уф! Надеюсь это поможет. Я уверен, что этот процесс не идеален, и он определенно не универсален, но, надеюсь, даст вам несколько советов. Я сделал это вики-сообществом, чтобы другие могли к нему добавить.

3 голосов
/ 15 июня 2011

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

mkdir sharedrepo
cd sharedrepo
git init --bare
echo "chmod -f -R a+rw ." >> hooks/post-receive
chmod a+x hooks/post-receive
cd ..
chmod -R a+rw sharedrepo
1 голос
/ 15 июня 2011

Поместите всех разработчиков в группу (скажем, developers) и запустите chgrp -R developers myrepo-on-the-server/.

...