सवाल मैं एक मशीन पर एकाधिक उपयोगकर्ताओं के साथ एक गिट भंडार कैसे साझा करूं?


मेरे पास एक स्टेजिंग सर्वर पर एक गिट भंडार है जो एकाधिक डेवलपर्स को खींचने में सक्षम होना चाहिए। git-init ऐसा लगता है कि मैं जो खोज रहा हूं उसके करीब एक झंडा है: --shared, सिवाय इसके कि मैं कई लोगों को उस भंडार में खींचना चाहता हूं। git-cloneकी --shared झंडा कुछ पूरी तरह से अलग करता है।

मौजूदा भंडार की अनुमतियों को बदलने का सबसे आसान तरीका क्या है?


201
2018-06-17 01:04


मूल


मैं "विंडोज के लिए जिथब" का उपयोग कर रहा हूं और दो गिथब खातों के बीच स्विच करता हूं: stackoverflow.com/questions/18565876/... - Alisa


जवाब:


अनुमति एक कीट हैं।

असल में, आपको यह सुनिश्चित करने की ज़रूरत है कि उन सभी डेवलपर्स गिट रेपो में सबकुछ लिख सकें।

डेवलपर्स के समूह को देने की श्रेष्ठ विधि के लिए नई-वेव समाधान पर जाएं, क्षमता लिखें।

मानक समाधान

यदि आप सभी डेवलपर्स को विशेष रूप से बनाए गए समूह में डालते हैं, तो आप सिद्धांत रूप से केवल यह कर सकते हैं:

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

फिर बदलें umask उपयोगकर्ताओं के लिए 002, ताकि नई फाइल समूह-लेखन योग्य अनुमतियों के साथ बनाई जाए।

इसके साथ समस्याएं सेना हैं; यदि आप एक distro पर हैं जो एक मानता है umask का 022 (जैसे एक आम है users समूह जिसमें डिफ़ॉल्ट रूप से सभी शामिल हैं), यह कहीं और सुरक्षा समस्याओं को खोल सकता है। और जल्दी या बाद में, कुछ सावधानी से तैयार की गई अनुमति योजना को खत्म करने जा रहा है, जब तक आप प्राप्त नहीं कर लेते हैं तब तक रेपो को कार्रवाई से बाहर कर दें root इसे एक्सेस करें और इसे ठीक करें (यानी, उपरोक्त आदेशों को फिर से चलाएं)।

न्यू वेव समाधान

एक बेहतर समाधान-हालांकि कम अच्छी तरह से समझ में आया, और जिसके लिए थोड़ा अधिक ओएस / उपकरण समर्थन की आवश्यकता है- POSIX विस्तारित विशेषताओं का उपयोग करना है। मैं केवल हाल ही में इस क्षेत्र में आया हूं, इसलिए मेरा ज्ञान यहां जितना गर्म हो उतना गर्म नहीं है। लेकिन मूल रूप से, एक विस्तारित एसीएल केवल 3 डिफ़ॉल्ट स्लॉट (उपयोगकर्ता / समूह / अन्य) से अधिक अनुमतियों को सेट करने की क्षमता है।

तो एक बार फिर, अपना समूह बनाएं, फिर चलाएं:

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

यह समूह के लिए विस्तारित एसीएल सेट करता है ताकि समूह के सदस्य जो भी फाइलें पहले से हैं (पहली पंक्ति) पढ़ सकें / लिख सकें / एक्सेस कर सकें; फिर, सभी मौजूदा निर्देशिकाओं को भी बताएं कि नई फाइलों में यह वही एसीएल लागू होना चाहिए (दूसरी पंक्ति)।

उम्मीद है कि आप अपने रास्ते पर हो जाता है।


171
2018-06-17 06:00



गिट इनिट में पैरामीटर नामक एक पैरामीटर होता है जो समूह के काम के लिए core.sharedRepository चर सेट करता है। आप एक मौजूदा भंडार पर चर सेट भी कर सकते हैं। इससे उमास्क को मैन्युअल रूप से सेट करने की आवश्यकता को हटा दिया जाता है क्योंकि गिट फाइलों में हेरफेर करने से पहले इसे एक सेन वैल्यू पर सेट कर देगा। - ptman
POSIX विस्तारित विशेषताओं के लिए +1 - मुझे खबर! - RobM
जब मैंने किया chmod -R g+swX, इसने गिट को बहुत दुखी बना दिया और यह फैसला किया कि यह अब एक गिट रिपोजिटरी नहीं है ("रेपो एक गिट रिपोजिटरी नहीं दिखता है")। मुझे जी-एस के सभी को chmod करना पड़ा फ़ाइलें। बस सेटगिड बिट को सेट करने के लिए निर्देशिका, प्रयत्न find /path/to/repo -type d -print0 | xargs -0 chmod g+s। अभी भी करो chgrp -R thegroup /path/to/repo। - rescdsk
chmod -R g+swX gitrepo फ़ाइलों को सेटगाइड बिट लागू करेगा, जो एक सुरक्षा जोखिम है। इसके बजाए, आप इसका उपयोग कर सकते हैं find . -type d -exec chmod g+s {} + इसे केवल निर्देशिकाओं पर लागू करने के लिए। - Ian Dunn
एसीएल (setfacl) में समूह फ़ाइल के उत्तराधिकारी के लिए निर्देशिका में बनाई गई नई फ़ाइलों और उप-निर्देशिकाओं को लागू करने के लिए सेटगिड की सेटिंग नहीं है। इसलिए, आपको chmod के माध्यम से अलग से सेटगिड सेट करना होगा। गिट का शेर विकल्प (git-scm.com/docs/git-init), हालांकि, आपको उपयोगकर्ता के उमास्क को सेट करने और ओवरराइड करने की अनुमति देता है। - Chase T.


यदि आपने रिपोजिटरी बनाई है (या मौजूदा एक नए नंगे रेपो को क्लोन किया है)

$ git init --shared=group 

या

$ git init --shared=0NNN

गिट को आपके डिफ़ॉल्ट उमास्क प्रदान किए जाने वाले उपरोक्त अनुमतियों को संभालने के लिए माना जाता है। अंत में यह गिट के मेरे संस्करण (1.6.3) पर सच है। बेशक यह मानता है कि आपके उपयोगकर्ता एक ही समूह में हैं।

अगर मुझे पढ़ने / लिखने की अलग-अलग डिग्री के साथ कई समूहों में उपयोगकर्ताओं के प्रबंधन की आवश्यकता होती है, तो मैं गिटोसिस के साथ जाऊंगा। मैंने गिटोलाइट का जिक्र भी सुना है (http://github.com/sitaramc/gitolite), एक गिटोसिस कांटा जिसे शाखा स्तर की अनुमति प्रदान करने के लिए suppossed है, यह नहीं कह सकता कि मैंने इसे व्यक्तिगत रूप से इस्तेमाल किया है।


113
2018-02-17 05:40



यह निश्चित रूप से सही जवाब है। - ELLIOTTCABLE
मुझे यह मुद्दा था और यह अब तक का सबसे अच्छा जवाब है। एकमात्र समस्या यह है कि --shared तर्क एक ऑक्टल में लेता है, हेक्साडेसिमल नहीं। मैंने गिट 1.7.8 के स्रोत में इसकी पुष्टि की है और दूसरा उदाहरण होना चाहिए git init --shared=0NNN। - qpingu
क्या है NNN-मिशन मास्क या समूह संख्या या कुछ और? - Craig McQueen
बीटीडब्ल्यू, उपरोक्त "समूह" एक कीवर्ड है, न कि आपके समूह के नाम के लिए प्लेसहोल्डर। आप chgrp कमांड का उपयोग कर समूह को असाइन करते हैं। एक नए रेपो के लिए यह है git init --bare --shared=group myproj जहां myproj आपका रेपो नाम है, उसके बाद chgrp -R mygroup myproj जहां मेरा समूह आपका समूह का नाम है। - labradort
यह बताता है कि यदि आपके उपयोगकर्ता तब काम करते हैं जब उनका डिफ़ॉल्ट समूह उससे अलग होता है, तो यह चीजों को खराब कर सकता है। इस समस्या को ठीक करने के लिए, आपको प्रत्येक उपयोगकर्ता को रिपो में सही फ़ाइल में मौजूद प्रत्येक फ़ाइल को चिपकाने की आवश्यकता होगी। यह तब तक रिक्त होगा जब तक कि आप यह समझते हैं कि हर किसी को काम करने और धक्का देने से पहले सही समूह के अंतर्गत / नई फ़ाइलों को कैसे बनाना / स्विच करना है। - ragerdl


यह नहीं कहा गया है, इसलिए मैं इसे जल्दी से जोड़ना चाहता हूं।

यह सुनिश्चित करने के लिए कि अनुमति मुद्दे उनके बदसूरत सिर को फसल नहीं करते हैं, अपने गिट साझा भंडार की कॉन्फ़िगरेशन फ़ाइल पर निम्न सेट करना सुनिश्चित करें:

[core]
    sharedRepository = true

यह सुनिश्चित करेगा कि आपके सिस्टम की "उमास्क" सेटिंग्स का सम्मान किया जाता है।


50
2018-03-09 05:52



गिट-कॉन्फिगर (1) के अनुसार (kernel.org/pub/software/scm/git/docs/git-config.html) core.sharedRepository, आपको गिट को उपयोगकर्ता के उमास्क का सम्मान करने के लिए इसे "उमास्क" या "झूठा" पर सेट करने की आवश्यकता है। - David Schmitt
यह और उपयोगकर्ता 35117 का उत्तर सही है। ध्यान दें कि "सत्य" "समूह" जैसा ही है, और इसे कमांड के साथ सेट किया जा सकता है git config core.sharedRepository true। - ColinM
क्या यह अभी भी एक फ़ाइल के स्वामित्व को बदलता है जब इसे रिमोट पर धक्का दिया जाता है? - Duc Tran
यदि आप इस तथ्य के बजाए क्लोनिंग करते समय इसे स्थापित करना चाहते हैं, तो इसके बराबर git init --shared है git clone --config core.sharedRepository=true। उपयोग करने के लिए गिट की अजीब --shared ऐसे समान आदेशों में इस तरह के अलग-अलग अर्थों के लिए। - stevek_mcc


गिट उपयोगकर्ता मैनुअल वर्णन करता है कि कैसे करें एक भंडार साझा करें कई मायनों में।

अधिक जटिल, हालांकि भंडार साझा करने के लिए सुविधा-पूर्ण तरीके हैं:

हम 6 डेवलपर्स की एक टीम के लिए गिटहब का उपयोग करते हैं।


21
2018-06-17 07:35



मुझे गिटोसिस पसंद है। यह सार्वजनिक कुंजी के आधार पर पहुंच को नियंत्रित करने का एक बहुत ही प्रभावी तरीका है। - Mike Mazur
इन समाधानों में से कोई भी "मैं कितने लोगों को उस भंडार में खींचना चाहता हूं" की समस्या का समाधान कैसे करता हूं? - womble♦
गिटोसिस पर एक नज़र डालें। वह आपकी समस्या हल करता है। - pilif
जब आप भंडार साझा करते हैं, तो लोग इससे खींच सकेंगे। उन्हें शायद इसे क्लोन करने की आवश्यकता होगी, या एक दूरस्थ शाखा जोड़ें। मेरे द्वारा लिंक किए गए दस्तावेज़ आपको आपकी समस्या को हल करने के माध्यम से बहुत स्पष्ट रूप से चलेंगे; मैंने डेवलपर्स को गिट के साथ स्रोत कोड सहयोग करने में मदद करने के लिए वर्णित सभी विधियों का उपयोग किया है। मेरे ज्ञान के लिए सर्वरफॉल्ट हैंडहोल्डिंग के लिए नहीं है। - jtimberman
मुझे गिटोसिस का उपयोग करने के साथ सहमत होना है। यह एकाधिक एसएसएच कुंजी द्वारा प्रमाणित एक खाते का उपयोग करके अनुमतियों के मुद्दे के आसपास हो जाता है। यह पूरी तरह से गिट काम करता है के माध्यम से भी प्रबंधित किया जाता है। - Jeremy Bouse


यह भी देखें gitolite अपने गिट भंडार की मेजबानी के लिए। जाहिर है कि गिटोसिस विकसित नहीं किया जा रहा है।


9
2018-01-19 08:55





साझा भंडार में अनुमतियों को ठीक करने का एक तरीका, इसलिए उपयोगकर्ताओं को धक्का देने पर अनुमति समस्या नहीं होगी, एक पोस्ट-अपडेट हुक स्क्रिप्ट बनाना है जो बस ऐसा करेगा। यह किसी भी गिट संस्करण में काम करना चाहिए।

मान लें कि आपके पास /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
निर्देशिका पर सेटगिड बिट सेट करना उन फ़ाइलों का कारण बनता है जो उपयोगकर्ता समान समूह स्वामित्व को निर्देशिका के रूप में प्राप्त करने के लिए बनाते हैं (यदि उपयोगकर्ता उस समूह से संबंधित हैं)। भले ही यह उपयोगकर्ता का डिफ़ॉल्ट समूह न हो। फिर इस हुक की जरूरत नहीं है। @ गर्भ का जवाब यही है (और इस पर मेरी टिप्पणी)। - rescdsk
इस केंद्र पर सूचीबद्ध प्रत्येक समाधान की कोशिश करने के बाद, मेरी सेंटोस 7 मशीन पर, उपरोक्त @ bkmks के समाधान का एकमात्र विकल्प था जो वास्तव में काम करता था (उपरोक्त के बाद पोस्ट-अपडेट के बजाय पोस्ट-मर्ज और पोस्ट-चेकआउट हुक सेट करना)। - Mike Godin


एक नया रेपो स्थापित करने के बारे में विभिन्न अन्य उत्तरों और टिप्पणियों से अच्छी सलाह के बिट्स और टुकड़ों को एकत्रित करने के लिए:

यदि आप एक नया नया रेपो स्थापित कर रहे हैं 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 अनुमतियां पढ़ें, लिखें, और निष्पादित करें (एसजीआईडी ​​बिट सेट के साथ-साथ ताकि उपयोगकर्ताओं के साथ काम करने के लिए भी mygroup उनका प्राथमिक समूह नहीं है)
    3. receive.denyNonFastforwards = 1: रेपो को नॉन फास्ट-फॉरवर्ड पुश करने से इंकार करें

यदि आप उपयोगकर्ता, समूह या अन्य उपयोगकर्ताओं की अनुमतियों को ठीक-ठीक करना चाहते हैं, तो उपयोग करें --shared=0NNN, कहा पे NNN मानक उपयोगकर्ता, समूह, और अन्य बिट्स के लिए हैं फ़ाइलें (निष्पादन और एसजीआईडी ​​बिट्स पर निर्देशिका गिट द्वारा उचित रूप से प्रबंधित किया जाएगा)। उदाहरण के लिए, यह उपयोगकर्ता को पढ़ने और लिखने की अनुमति देता है, और समूह को केवल पढ़ने के लिए उपयोग (और अन्य तक कोई पहुंच नहीं):

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-डेमॉनअधिक जानकारी के लिए।

संपादित करें:

यह लेख भी देखें अपने गिट भंडार को साझा करने के 8 तरीके


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





@stevek_mcc उत्तर वह है जिसे मैं ढूंढ रहा था जब मैंने इस प्रश्न के लिए गुगल किया था

git clone --config core.sharedRepository=true

0
2018-03-29 19:02