Як я можу поділитися сховищем Git з декількома користувачами на машині?


216

У мене на сховищному сервері є сховище Git, до якого потрібно мати декілька розробників. git-initначебто, прапор дуже близький до того, що я шукаю: --sharedза винятком того, що я хотів би, щоб кілька людей перебралися до цього сховища. git-clone«S --sharedпрапор робить що - то зовсім інше.

Який найпростіший спосіб змінити дозволи на існуючий сховище?


Я використовую "Github для Windows" і перемикаюся між двома обліковими записами Github: stackoverflow.com/questions/18565876/…
Аліса

Відповіді:


186

Дозволи - це шкідник.

По суті, вам потрібно переконатися, що всі ці розробники можуть записати все, що є в git repo.

Перейдіть до Нового хвильового рішення для покращеного способу надання групі розробників можливості запису.

Стандартне рішення

Якщо ви розмістите всіх розробників у спеціально створеній групі, ви, в принципі, можете просто зробити:

chgrp -R <whatever group> gitrepo
chmod -R g+swX gitrepo

Потім змініть на, umaskщоб користувачі створювали 002нові файли з дозволами, які можна записати для групи.

Проблеми з цим - легіон; якщо ви на дистрибутиві , який приймає umaskз 022(наприклад, мають загальну usersгрупу , яка включає в себе всі за замовчуванням), то це може відкрити проблем безпеки в інших місцях. І рано чи пізно щось буде накручувати вашу ретельно продуману схему дозволів, виводячи репо з дії, поки ви не отримаєте rootдоступ і не виправите це (тобто повторно запустіть вищезазначені команди).

Рішення нової хвилі

Прекрасне рішення - хоча і менш добре зрозуміле і яке потребує трохи більшої підтримки ОС / інструментів - полягає у використанні розширених атрибутів POSIX. Я прийшов у цю область лише нещодавно, тому мої знання тут не такі гарячі, як це могло б бути. Але в основному розширений ACL - це можливість встановлювати дозволи на більше ніж 3 слоти за замовчуванням (користувач / група / інші).

Тому ще раз створіть свою групу та запустіть:

setfacl -R -m g:<whatever group>:rwX gitrepo
find gitrepo -type d | xargs setfacl -R -m d:g:<whatever group>:rwX

Це встановлює розширений ACL для групи, щоб члени групи могли читати / записувати / отримувати доступ до файлів, які вже є (перший рядок); потім також скажіть усім існуючим каталогам, що до нових файлів має бути застосований цей самий ACL (другий рядок).

Сподіваюсь, що вас заведе на шляху.


62
git init має параметр під назвою --shared, який встановлює змінну core.sharedRepository для групової роботи. Ви також можете встановити змінну на існуючому сховищі. Це знімає необхідність вручну встановити umask, оскільки git встановить його до здорового значення перед маніпулюванням файлами.
птман

6
+1 для розширених атрибутів POSIX - новини для мене!
RobM

5
Коли я це зробив chmod -R g+swX, це зробило Git дуже нещасним, і він вирішив, що це вже не сховище git ("repo, схоже, не є сховищем git"). Я повинен був chmod gs всі файли . Щоб просто встановити біт setgid в каталогах , спробуйте find /path/to/repo -type d -print0 | xargs -0 chmod g+s. Все-таки зробіть chgrp -R thegroup /path/to/repo.
rescdsk

10
chmod -R g+swX gitrepoзастосує біт setguid до файлів, що є ризиком для безпеки. Натомість ви можете використовувати його find . -type d -exec chmod g+s {} +для застосування лише до каталогів.
Ian Dunn

1
ACL (setfacl) не має налаштування для setgid для примусового використання нових файлів і підкаталогів, створених у каталозі, для успадкування його ідентифікатора групи. Тому ви повинні встановити setgid окремо через chmod. Опція - спільне використання Git ( git-scm.com/docs/git-init ), однак, дозволяє встановлювати жорсткі та перевершувати umask користувача.
Чейз Т.

121

якщо ви створили сховище (або клонували нове оголене репо від існуючого) за допомогою

$ git init --shared=group 

або

$ git init --shared=0NNN

Git повинен обробляти дозволи вище та поза тим, що передбачено вашим umask за замовчуванням. Нарешті, це стосується моєї версії Git (1.6.3). Звичайно, це передбачає, що ваші користувачі в одній групі.

Якщо мені потрібно управління користувачами в декількох групах з різним ступенем читання / запису, я б пішов з гітозом. Я також чув про згадку про gitolite ( http://github.com/sitaramc/gitolite ), вилці гітозу, яка, як передбачається, надає дозволи на рівні гілки, не можу сказати, що я кожен використовував її особисто.


9
Це, безумовно, правильна відповідь.
ELLIOTTCABLE

4
У мене було це питання, і це, безумовно, найкраща відповідь. Єдина проблема полягає в тому, що --sharedаргумент приймає восьмеричний, а не шістнадцятковий. Я підтвердив це у джерелі Git 1.7.8, і другий приклад повинен бути git init --shared=0NNN.
qpingu

3
Що таке - NNNмаска дозволу, номер групи або щось інше?
Крейг МакКуїн

20
BTW, "група" вище - це ключове слово, а не заповнювач для назви вашої групи. Ви призначаєте групу за допомогою команди chgrp. Для нового репо - це місце, git init --bare --shared=group myprojде myproj - ваше ім'я репо, а далі - chgrp -R mygroup myprojмоя група.
labradort

2
Наголошує, що якщо ваші користувачі здійснюють зобов’язання, коли їх група за замовчуванням відрізняється від тієї, що має бути, це може накрутити справи. Щоб виправити цю проблему, потрібно, щоб кожен користувач переглянув кожен потрібний файл у репо в потрібну групу. Це повториться, якщо ви не з’ясуєте, як змусити всіх створювати / перемикати нові файли під / в потрібну групу перед тим, як зробити або натиснути.
ragerdl

55

Цього не було сказано, тому я хочу швидко додати його.

Щоб проблеми з дозволами не обрізали їхню некрасиву голову, переконайтеся, що в конфігураційному файлі вашого сховища сховища git встановлено наступне:

[core]
    sharedRepository = true

Це забезпечить дотримання налаштувань вашої системи "umask".


6
Відповідно до git-config (1) ( kernel.org/pub/software/scm/git/docs/git-config.html ) core.sharedRepository, вам потрібно встановити це значення "umask" або "false", щоб мати відношення до git користувацький умаск.
Девід Шмітт

14
Відповідь цього і користувача35117 правильна. Зауважте, що "true" - це те саме, що "group", і це можна встановити за допомогою команди git config core.sharedRepository true.
ColinM

Чи все-таки змінюється право власності на файл, коли його натискають на віддалений?
Duc Tran

2
Якщо ви хочете встановити це під час клонування, а не після факту, еквівалент git init --sharedє git clone --config core.sharedRepository=true. Дивно використовувати git --sharedдля таких різних значень у подібних командах.
stevek_mcc

21

Керівництво користувача Git описує , як розділити сховище кількох способів.

Складніші, хоча повнофункціональні способи спільного використання сховищ:

Ми використовуємо GitHub для команди з 6 розробників.


1
Мені подобається Гітоз. Це досить ефективний спосіб контролю доступу на основі відкритих ключів.
Майк Мазур

Як будь-яке з цих рішень вирішує проблему "Я хотів би, щоб кілька людей перейшли до цього сховища"?
жіноча

поглянути на гітоз. що один вирішує вашу проблему.
pilif

3
Коли ви поділитесь сховищем, люди зможуть вийти з нього. Ймовірно, їх буде потрібно клонувати або додати віддалену гілку. Документація, з якою я зв’язана, дуже чітко допоможе вам вирішити ваше питання; Я використовував усі описані методи, щоб допомогти розробникам співпрацювати вихідний код з Git. Наскільки мені відомо, ServerFault не призначений для тримання.
jtimberman

3
Я маю згоду з використанням Gitosis. Він вирішує проблему дозволів, використовуючи один обліковий запис, засвідчений автентичністю декількох ключів SSH. Він також керується повністю самостійно за допомогою git commits.
Джеремі Бууз

9

Також подивіться на gitolite для розміщення вашого git сховища. Гітоз, очевидно, вже не розробляється.


4

Один із способів виправити дозволи в спільному сховищі, так що користувачі не матимуть проблем з дозволом під час натискання, - це створити сценарій гачка після оновлення, який зробить саме це. Це має працювати в будь-якій версії git.

Припустимо, у вас є спільне сховище в /myrepo.git. Усі файли у цьому сховищі належать до розділу mysharedgroup . Усі користувачі, що переходять до цього сховища, також повинні належати до mysharedgroup . Тепер створіть такий файл (змінивши mysharedgroup відповідно до ваших уподобань):

/myrepo.git/hooks/post-update

#!/bin/sh
chmod -R g+w . 2>/dev/null
chgrp -R mysharedgroup . 2>/dev/null

правильна відповідь, коли користувачі мають різні групи за замовчуванням
пат

Якщо встановити біт setgid в каталозі, файли, які користувачі створюють, успадковують те саме право власності на групу, що і каталог (якщо користувачі належать до цієї групи). Навіть якщо це не група за замовчуванням користувачів. Тоді цей гачок не потрібен. Це те, що робить @ @bleble відповідь (і мій коментар до цього).
rescdsk

На моєму апараті centos7 після спроби кожного рішення, перерахованого на цій сторінці, варіант рішення @ bkmks вище був єдиним варіантом, який фактично працював (встановлення гаків після злиття та після перевірки замість пост-оновлення, як вище).
Майк Годін

Я думаю, що це погана порада розробити рішення, яке передає повідомлення про помилки або попередження на STDER /dev/null. Будь ласка, дайте користувачеві спочатку побачити ці повідомлення, а потім вирішити самостійно.
Даніель Бьомер

3

Щоб узагальнити шматочки та корисні поради з різних інших відповідей та коментарів щодо створення нового репо:

Якщо ви налаштовуєте абсолютно новий репозиторій myrepoв /srv/gitдля групи mygroup, це те , що ви хочете:

mkdir /srv/git/myrepo.git
chgrp mygroup /srv/git/myrepo.git
git init --bare --shared /srv/git/myrepo.git
  1. перший рядок створює репо-реж
  2. другий рядок встановлює свою групу на mygroup
  3. третій рядок ініціалізує голий репо з такою конфігурацією:
    1. core.bare = true: зробити це голим репо
    2. core.sharedrepository = 1(те саме core.sharedrepository = group): каталог репо та всі створені в ній каталоги згодом будуть керуватися git, щоб дозволити mygroupчитати, записувати та виконувати дозволи (з встановленим бітом sgid - так, щоб працювати з користувачами, для яких mygroupце не їх первинна група)
    3. receive.denyNonFastforwards = 1: заперечувати нешвидкісні поштовхи вперед до репо

Якщо ви хочете точно налаштувати дозволи користувача, групи чи інших користувачів, використовуйте --shared=0NNN, де NNNзнаходяться стандартні користувацькі, групові та інші біти для файлів (біти виконання та sgid в каталогах будуть належним чином керовані git). Наприклад, це дозволяє користувачеві отримувати доступ для читання та запису та доступ до групи лише для читання (а не доступ до інших):

git init --bare --shared=0640 /srv/git/myrepo.git

Це дозволяє отримати доступ до читання та запису користувачеві та групі (а також немає доступу до інших):

git init --bare --shared=0660 /srv/git/myrepo.git

Це дозволяє користувачеві та групі отримати доступ для читання та запису та доступ до інших лише для читання:

git init --bare --shared=0664 /srv/git/myrepo.git

Зауважте, що якщо ви не збираєтеся дозволити запис запису до групи, спочатку переконайтеся, що chownвстановити власника репо, а потім запустіть git initкоманду як цього користувача (щоб переконатися, що репо ініціалізується з правильним власником для всі початкові файли та підкаталоги).


Правильніше, ніж вищі відповіді голосів.
XO01


1

Виконання саме цього працювало для мене, для існуючого сховища. Тут потрібні поради з кількох відповідей та коментарів:

З батьківського каталогу вашого сховища на сервері:

chgrp -R <whatever group> gitrepo
chmod -R g+wX gitrepo
cd gitrepo
find . -type d -exec chmod g+s {} +
git config core.sharedRepository group

0

Відповідь @stevek_mcc - це те, що я шукав, коли шукав це питання

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