Як налаштувати існуючий git repo для спільного використання групою UNIX


98

У мене є вже git repo (голий), який до цього моменту був написаний лише мною. Я хочу відкрити це для якоїсь групи користувачів UNIX, foo, щоб усі члени foo могли натиснути на нього. Я знаю, що легко можу створити нове git repo за допомогою:

git init --bare --shared=group repodir
chgrp -R foo repodir

Але мені потрібна рівнозначна операція для існуючого репо- режиму .


4
На це питання є чудова відповідь на сервері ServerFault (інший сайт StackOverflow).
Зерін

Відповіді:


114

Спробуйте це створити наявне сховище в 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")

14
Я додам, що вам, мабуть, слід також встановити config.sharedRepository = true у конфігурації репо. kernel.org/pub/software/scm/git/docs/git-config.html
Пістос

1
Це досить близько до того, що я робив самостійно, але хотів отримати деяке зовнішнє підтвердження. Дякую. :) Я також сподівався, що буде git-клон --shared = груповий щось подібне, але варіант -shared клона робить щось зовсім інше.
Пістос

5
Ви можете використовувати git init --sharedкоманду на існуючому репо, щоб встановити значення конфігурації. Вам також потрібно виконати chmodкоманду, щоб правильно дозволити файли.
Спенсер

1
Підтвердити це також допомагає, якщо ви в заплутаному стані, тому що хтось зробив і git pullт.д. як корінь, а не як www-dataвласник власника і як результат ви отримаєте error: insufficient permission for adding an object to repository database .git/objects. Я думав, що я виправив право власності на всі файли / каталоги, які не використовували findта -type d/ type -f, але тільки цей метод позбувся помилки (проблема, тому що файл у якомусь підкаталозі не піддавався групі для запису?)
Вільям Террелл

1
Умаск користувача все ще застосовується до новостворених файлів. Це те, чого ви очікуєте? Я думаю, що в документації core.sharedRepositoryзгадується це - це видається марним, якщо користувачі не роблять усіх своїх файлів для запису.
Сем Брайтман

47

У репортажі виконайте такі команди:

git config core.sharedRepository group
chgrp -R foo repodir
chmod -R g+w repodir

Редагувати: щоб вирішити часті плутанини, groupце власне ключове слово, ви не повинні замінювати це назвою групи.


25
Де groupНЕ назва групи :)
Pierre de LESPINAY

7
Файли об'єктів і пакунків повинні бути незмінними; вони повинні мати дозволи 444 / r - r - r--.
CB Bailey

3
Після спроби git config core.sharedRepository devпотім набравши git configя отримую fatal: bad config value for 'core.sharedrepository' in .git/configв git version 1.7.0.4(і , можливо , версії після)
Kzqai

3
git config core.sharedRepository group group- це не назва групи, а фактичне значення!
kixorz

Якщо ви помилилися використовувати назву групи замість "групи", просто відкрийте .git / config у текстовому редакторі та відредагуйте рядок core.sharedRepository, щоб сказати "група".
Том

43

Об’єднавши відповіді @David Underhill і @kixorz , я прийняв власне (остаточне) рішення.

Це для голих репостів і не голих репостів. Між ними є лише невеликі відмінності, але таким чином ясніше.

БАРЕ РЕПОЗИТОРІЯ

cd <repo.git>/                            # Enter inside the git repo
git config core.sharedRepository group    # Update the git's 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's 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's 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's group id

де:

  • <project_dir>- каталог проектів, що містить .gitпапку.
  • <group-name>- назва групи для користувачів git (наприклад, користувачів ).

Як сказав Чарльз, також зробіть: chmod g-w objects/pack/*(якщо не голий сховище, передбачте .git/)
Wernight,

тут як ми можемо знайти назву групи або як створити назву групи?
Sujithrao

'chmod g + s find . -type d' викликає помилкуunable to execute /bin/chmod: Argument list too long
Dr.X

Як зазначав @ Dr.X, chmod g+s `find . -type d`він не масштабується. Використанняfind -type d -exec chmod g+s {} +
hagello

Я думаю, що всі вільні об’єкти також повинні бути доступними лише для читання на основі попереднього стану. Можливо, щось на кшталт chmod g-w objects/*/*. Я не впевнений у інформаційному підкаталозі, однак, оскільки він порожній для цього репо.
Ерік

3

Це, мабуть, не обов’язково, але варто зазначити, що git init --bare --sharedтакож встановлюється опція denyNonFastForwards .

git config receive.denyNonFastForwards true

Сенс цього варіанту полягає в наступному:

receive.denyNonFastForwards

Якщо ви перезавантажуєте команду, яку ви вже натиснули, а потім намагаєтесь натиснути ще раз, або іншим чином намагаєтесь натиснути на віддалену гілку, яка не містить комісію, на яку в даний момент вказує віддалена гілка, вам буде відмовлено. Це взагалі гарна політика; але у випадку з ребазою ви можете визначити, що ви знаєте, що ви робите, і можете змусити оновити віддалену гілку з прапором -f до вашої push-команди.

(від http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration )


1

На додаток до вищезазначених відповідей, що дозволяють групі читати / писати, вам також потрібно додати користувача до групи (скажімо, "foo").

sudo usermod -a -G [groupname] [username]

Примітка: спочатку вам доведеться створити користувача, якщо його не існує

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.