سؤال كيف يمكنني مشاركة مستودع Git مع عدة مستخدمين على الجهاز؟


لدي مستودع Git على خادم التدريج الذي يحتاجه المطورون المتعددين ليكونوا قادرين على السحب إليه. git-init يبدو أنه قريب جدًا من ما أبحث عنه: --shared، ما عدا أنني أود أن يسحب عدة أشخاص هذا المستودع أيضًا. ال git-cloneالصورة --shared العلم يفعل شيئا مختلفا تماما.

ما هي أسهل طريقة لتغيير أذونات مستودع موجود؟


202
2018-06-17 01:04


الأصل


أنا أستخدم "Github for Windows" وقمت بالتبديل بين حسابي Github: stackoverflow.com/questions/18565876/... - Alisa


الأجوبة:


الأذونات هي الآفات.

في الأساس ، تحتاج إلى التأكد من أن كل هؤلاء المطورين يمكنهم الكتابة إلى كل شيء في 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 (السطر الثاني).

آمل أن يجعلك في طريقك.


172
2018-06-17 06:00



يحتوي git init على معلمة تسمى - sharhar والتي تقوم بإعداد متغير core.sharedRepository للعمل الجماعي. يمكنك أيضًا تعيين المتغير على مستودع موجود. يؤدي ذلك إلى إزالة الحاجة إلى تعيين umask يدوياً كما سيتم تعيينه git إلى قيمة عاقل قبل معالجة الملفات. - ptman
+1 لسمات POSIX الموسعة - الأخبار بالنسبة لي! - RobM
عندما فعلت chmod -R g+swX، جعلت Git غير سعيد للغاية وقررت أنه لم يعد مستودع git بعد الآن ("لا يبدو أن الريبو مستودع git"). اضطررت إلى chmod g-s كل من ملفات. لتعيين فقط Setgid بت على الدلائل، محاولة find /path/to/repo -type d -print0 | xargs -0 chmod g+s. لا تزال تفعل chgrp -R thegroup /path/to/repo. - rescdsk
chmod -R g+swX gitrepo سيطبق بت setguid على الملفات ، وهو خطر أمني. بدلا من ذلك ، يمكنك استخدام find . -type d -exec chmod g+s {} + لتطبيقه على الأدلة فقط. - Ian Dunn
لا يحتوي ACL (setfacl) على إعداد setgid لفرض الملفات والدلائل الفرعية الجديدة التي تم إنشاؤها داخل الدليل لترث معرف المجموعة الخاص بها. لذلك ، يجب عليك ضبط setgid بشكل منفصل من خلال chmod. Git's - مشاركة الخيار (git-scm.com/docs/git-init) ، ومع ذلك ، يسمح لك setgid وتجاوز umask للمستخدم. - Chase T.


إذا قمت بإنشاء المستودع (أو استنسعت ريبو عارية جديدة من القائمة) مع

$ git init --shared=group 

أو

$ git init --shared=0NNN

من المفترض أن تتعامل Git مع أذونات تفوق ما تقدمه umask الافتراضية الخاصة بك. أخيرا هذا صحيح على إصدار Git (1.6.3). يفترض هذا بالطبع أن المستخدمين لديك في نفس المجموعة.

إذا كنت بحاجة إلى إدارة المستخدمين في مجموعات متعددة بدرجات متفاوتة من القراءة / الكتابة ، فإنني سأذهب مع الحمرة. لقد سمعت أيضا ذكر gitolite (http://github.com/sitaramc/gitolite) ، شوكة تنعم بالريح التي يتم تفويتها لتوفير أذونات مستوى الفرع ، لا أستطيع أن أقول لقد استخدمت كل ذلك شخصيا رغم ذلك.


113
2018-02-17 05:40



هذا بالتأكيد هو الجواب الصحيح. - ELLIOTTCABLE
كان لدي هذه المشكلة وهذا هو أفضل إجابة حتى الآن. المشكلة الوحيدة هي أن --shared يأخذ الوسيطة في الثماني ، وليس الست عشري. لقد أكدت هذا في مصدر GIT 1.7.8 والمثال الثاني يجب أن يكون git init --shared=0NNN. - qpingu
ما هو NNNقناع القناع أو رقم المجموعة أو أي شيء آخر؟ - Craig McQueen
راجع للشغل ، "المجموعة" أعلاه هي كلمة أساسية ، وليست عنصرًا نائبًا لاسم مجموعتك. قمت بتعيين المجموعة باستخدام الأمر chgrp. من أجل الريبو الجديد هو git init --bare --shared=group myproj حيث myproj هو اسم الريبو الخاص بك ، يتبعه chgrp -R mygroup myproj حيث mygroup هو اسم مجموعتك. - labradort
يرأس أنه إذا قام مستخدموك بإجراء الإلتزامات عندما تكون مجموعتهم الافتراضية مختلفة عما يجب أن يكون ، فإنه يمكن أن يفسد الأمور. لإصلاح هذه المشكلة ، ستحتاج إلى أن يقوم كل مستخدم بإجراء chgrp لكل ملف يمتلكه في الريبو إلى المجموعة اليمنى. سيتكرر ذلك ما لم تتوصل إلى كيفية جعل الجميع ينشئون / يبدّلون الملفات الجديدة تحت / إلى المجموعة الصحيحة قبل الالتزام والدفع. - ragerdl


لم يتم قول هذا ، لذلك أريد إضافته بسرعة.

للتأكد من أن مشكلات الأذونات لا تقطع رأسها القبيح ، تأكد من تعيين التالي على ملف تهيئة مستودع git المشترك:

[core]
    sharedRepository = true

سيضمن ذلك أن إعدادات "umask" الخاصة بالنظام الخاص بك يتم احترامها.


50
2018-03-09 05:52



وفقا ل git-config (1) (kernel.org/pub/software/scm/git/docs/git-config.html) core.sharedRepository ، تحتاج إلى تعيين هذا إلى "umask" أو "false" لجعل git احترام umask المستخدم. - David Schmitt
هذا الجواب و user35117 هو الصحيح. لاحظ أن "true" هو نفسه "group" ، ويمكن تعيين هذا الأمر مع الأمر git config core.sharedRepository true. - ColinM
هل لا يزال يغير ملكية الملف عندما يتم دفعه إلى بعيد؟ - Duc Tran
إذا كنت ترغب في إعداد هذا عند الاستنساخ وليس بعد الحقيقة ، أي ما يعادل git init --sharedهو git clone --config core.sharedRepository=true. غريب من استخدام git --shared لمثل هذه المعاني المختلفة في مثل هذه الأوامر المتشابهة. - stevek_mcc


ال دليل المستخدم يصف كيف مشاركة مستودع في عدة طرق.

أكثر تعقيدًا ، على الرغم من أن الطرق الكاملة لتقاسم المستودعات هي:

نحن نستخدم GitHub لفريق مكون من 6 مطورين.


21
2018-06-17 07:35



أنا أحب الحيتان. إنها طريقة فعالة جدًا للتحكم في الوصول استنادًا إلى المفاتيح العامة. - Mike Mazur
كيف يمكن لأي حل من هذه الحلول حل مشكلة "أريد أن يسحب أشخاص متعددين إلى ذلك المستودع"؟ - womble♦
إلقاء نظرة على الحمام. هذا واحد يحل مشكلتك. - pilif
عند مشاركة المستودع ، سيتمكن الأشخاص من الانسحاب منه. ستحتاج على الأرجح إلى استنساخها ، أو إضافة فرع بعيد. من الواضح أن الوثائق التي ارتبط بها ستوجهك خلال حل مشكلتك ؛ لقد استخدمت كل الطرق الموضحة لمساعدة المطورين على التعاون مع شفرة المصدر مع Git. على حد علمي ، لا يعد ServerFault من أجل التملك. - jtimberman
لا بد لي من الاتفاق مع استخدام Gitosis. انها تحصل حول مسألة أذونات باستخدام حساب واحد مصدقة من قبل عدة مفاتيح SSH. تدار أيضا نفسها تماما عبر ارتكاب بوابة. - Jeremy Bouse


انظر أيضا gitolite لاستضافة مستودع git الخاص بك. لا يبدو أن الحمام الرحيم يجري تطويره بعد الآن.


9
2018-01-19 08:55





هناك طريقة واحدة لإصلاح الأذونات في مستودع التخزين المشترك ، بحيث لا يواجه المستخدمون مشكلات في الإذن عند الدفع ، وهي إنشاء نص برمجي لما بعد التحديث سيؤدي إلى ذلك تمامًا. هذا يجب أن يعمل في أي إصدار 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

4
2017-09-27 14:35



الإجابة الصحيحة عندما يكون لدى المستخدمين مجموعات افتراضية مختلفة - Pat
سيؤدي تعيين البتة setgid على دليل إلى ملفات ينشئها المستخدمون لترث نفس ملكية المجموعة كدليل (إذا كان المستخدمون ينتمون إلى تلك المجموعة). حتى لو لم تكن المجموعة الافتراضية للمستخدمين. ثم ليست هناك حاجة إلى هذا هوك. هذا هو ما تفعله إجابة womble (وتعليقي عليه). - rescdsk
على جهاز Centos7 الخاص بي ، بعد تجربة كل حل مدرج في هذه الصفحة ، كان البديل من حل bkmks أعلاه هو الخيار الوحيد الذي نجح بالفعل (إعداد خطافات الدمج اللاحقة والخروج بدلاً من التحديث اللاحق كما هو مذكور أعلاه). - Mike Godin


لتجميع أجزاء ومشورة جيدة من مختلف الإجابات والتعليقات حول إنشاء repo جديد:

إذا كنت تقوم بإعداد ريبو جديد 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): سوف تتم إدارة دليل الريبو وجميع الأدلة التي تم إنشاؤها في وقت لاحق من قبل بوابة للسماح 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 الأمر بهذا المستخدم (للتأكد من تهيئة الريبو بالمالك الصحيح لجميع الملفات الأولية والأدلة الفرعية).


3
2018-05-26 01:24



أكثر صحة من ردود التصويت العالي. - XO01


يمكنك استخدام git-daemon لمشاركة المستودع. قراءة الوثائق ل GIT-الخفيللمزيد من المعلومات.

تصحيح:

تحقق أيضا من هذه المادة 8 طرق لمشاركة مستودع git الخاص بك.


2
2018-06-17 02:58





عمل هذا بالضبط بالنسبة لي ، لمستودع موجود. يأخذ هذا المشورة من عدة إجابات وتعليقات قبل:

من الدليل الرئيسي لمستودعك ، على الخادم:

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

1
2017-12-13 12:44