मैं एक मशीन पर कई उपयोगकर्ताओं के साथ Git रिपॉजिटरी कैसे साझा करूं?


216

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

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


मैं "Github for Windows" का उपयोग कर रहा हूं और दो Github खातों के बीच स्विच कर रहा हूं: stackoverflow.com/questions/18565876/…
Alisa

जवाबों:


186

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

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

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

मानक समाधान

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

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

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

आशा है कि आप अपने रास्ते पर हो जाता है।


62
git init में एक पैरामीटर होता है, जिसे ss कहा जाता है जो समूह के काम के लिए core.saredRepository चर सेट करता है। आप किसी मौजूदा रिपॉजिटरी पर चर भी सेट कर सकते हैं। यह umask को मैन्युअल रूप से सेट करने की आवश्यकता को हटाता है क्योंकि git इसे फ़ाइलों में हेरफेर करने से पहले एक साने मूल्य पर सेट करेगा।
पीटीमैन

6
POSIX विस्तारित विशेषताओं के लिए +1 - मेरे लिए समाचार!
रॉब नोव

5
जब मैंने किया chmod -R g+swX, तो इसने जीआईटी को बहुत दुखी कर दिया और यह तय कर लिया कि यह अब जीआईटी रिपॉजिटरी नहीं है ("रेपो एक गैट रिपॉजिटरी प्रतीत नहीं होता")। मैं फ़ाइलों के सभी ग्राम chmod था । केवल निर्देशिकाओं पर सेटगिड बिट सेट करने के लिए , प्रयास करें 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फाइलों के लिए सेटगिट बिट लागू करेगा, जो एक सुरक्षा जोखिम है। इसके बजाय, आप find . -type d -exec chmod g+s {} +इसे केवल निर्देशिकाओं पर लागू करने के लिए उपयोग कर सकते हैं ।
इयान दून

1
ACL (setfacl) के पास अपनी समूह ID को प्राप्त करने के लिए निर्देशिका के भीतर बनाई गई नई फ़ाइलों और उपनिर्देशिकाओं को लागू करने के लिए setgid के लिए सेटिंग नहीं है। इसलिए, आपको अलग से chmod के माध्यम से सेटगाइड सेट करना होगा। हालांकि, Git --saring विकल्प ( git-scm.com/docs/git-init ), हालांकि, आपको उपयोगकर्ता के umask को सेट करने और ओवरराइड करने की अनुमति देता है।
चेस टी।

121

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

$ git init --shared=group 

या

$ git init --shared=0NNN

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

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


9
यह निश्चित रूप से सही उत्तर है।
ELLIOTTCABLE

4
मेरे पास यह मुद्दा था और यह अब तक का सबसे अच्छा जवाब है। एकमात्र समस्या यह है कि --sharedतर्क एक अष्टकोणीय में लेता है, हेक्साडेसिमल नहीं। मैंने जीआईटी 1.7.8 के स्रोत में इसकी पुष्टि की है और दूसरा उदाहरण होना चाहिए git init --shared=0NNN
qpingu

3
क्या NNNहै- स्पर्ममिशन मास्क या एक ग्रुप नंबर या कुछ और?
क्रेग मैकक्वीन

20
BTW, "समूह" ऊपर एक कीवर्ड है, आपके समूह के नाम के लिए प्लेसहोल्डर नहीं है। आप समूह को chgrp कमांड का उपयोग करके असाइन करते हैं। एक नए रेपो के लिए यह वह git init --bare --shared=group myprojजगह है जहां myproj आपका रेपो नाम है, उसके बाद chgrp -R mygroup myprojमाइग्रुप आपके समूह का नाम है।
लैब्राडॉर्ट

2
सिर ऊपर है कि अगर आपके उपयोगकर्ता बनाते हैं जब उनके डिफ़ॉल्ट समूह की तुलना में अलग है, तो यह चीजों को पेंच कर सकता है। इस समस्या को ठीक करने के लिए, आपको प्रत्येक उपयोगकर्ता को रेपो में खुद को सही समूह में रखने वाली प्रत्येक फ़ाइल को चुगाने की आवश्यकता होगी। यह तब तक पुनरावृत्ति करेगा जब तक कि आप यह पता नहीं लगाते हैं कि हर किसी को कमिट करने और पुश करने से पहले सही समूह में / के तहत नई फ़ाइलों को बनाने / स्विच करने का तरीका क्या है।
ragerdl

55

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

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

[core]
    sharedRepository = true

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


6
Git-config (1) ( kernel.org/pub/software/scm/git/docs/git-config.html ) core.saredRepository के अनुसार, आपको git सम्मान पाने के लिए इसे "umask" या "false" पर सेट करना होगा। उपयोगकर्ता का उमर।
डेविड श्मिट

14
यह और user35117 का उत्तर सही है। ध्यान दें कि "सच" "समूह" के समान है, और इसे कमांड के साथ सेट किया जा सकता है git config core.sharedRepository true
कॉलिनम

क्या यह अभी भी एक फ़ाइल के स्वामित्व को बदल देता है जब इसे दूरस्थ पर धकेल दिया जाता है?
डुक ट्रान

2
यदि आप इस तथ्य के बाद क्लोनिंग के बजाय इसे स्थापित करना चाहते हैं, तो समतुल्य git init --sharedहै git clone --config core.sharedRepository=true--sharedइस तरह के समान आदेशों में ऐसे विभिन्न अर्थों के लिए उपयोग करने की अजीब व्यवस्था ।
स्टीववे_मेक

21

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

  • Git Daemon के माध्यम से निर्यात करना ।
  • HTTP के माध्यम से निर्यात करना ।
  • सीवीएस / एसवीएन शैली, एक एकल साझा भंडार जहां डेवलपर्स पुश / पुल करते हैं।

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

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


1
मुझे गिटोसिस पसंद है। यह सार्वजनिक कुंजियों के आधार पर पहुंच को नियंत्रित करने का एक बहुत प्रभावी तरीका है।
माइक मजूर

इन समाधानों में से कोई भी समाधान "मैं कई लोगों को उस भंडार पर खींचना चाहता हूं" की समस्या को हल करता है?
Womble

गिटोसिस पर एक नजर जो आपकी समस्या का समाधान करता है।
पायल

3
जब आप भंडार को साझा करते हैं, तो लोग इसे खींचने में सक्षम होंगे। वे संभवतः इसे क्लोन करने के लिए, या एक दूरस्थ शाखा जोड़ने की आवश्यकता होगी। मैंने जो दस्तावेज़ जोड़ा है वह बहुत स्पष्ट रूप से आपकी समस्या को हल करने के माध्यम से चलेगा; मैंने उन सभी तरीकों का उपयोग किया है जो डेवलपर्स को Git के साथ स्रोत कोड को सहयोग करने में मदद करते हैं। मेरे ज्ञान के लिए ServerFault हैंडहोल्डिंग के लिए नहीं है।
::३४ पर jtimberman

3
मुझे गिटोसिस के उपयोग से सहमत होना होगा। यह कई SSH कुंजी द्वारा प्रमाणित एकल खाते का उपयोग करके अनुमतियाँ समस्या के आसपास हो जाता है। इसे जीआईटी कमिट्स के माध्यम से भी पूरी तरह से प्रबंधित किया जाता है।
जेरेमी बोस

9

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


4

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

मान लीजिए कि आपके पास /myrepo.git में एक साझा भंडार है। उस रिपॉजिटरी की सभी फाइलें मायशेडग्रुप कहने के लिए हैं । उस रिपॉजिटरी में धकेलने वाले सभी उपयोगकर्ताओं को mysaredgroup का भी होना चाहिए । अब निम्नलिखित फ़ाइल बनाएं ( अपनी प्राथमिकताओं में माइशेडग्रुप बदलकर ):

/myrepo.git/hooks/post-update

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

उपयोगकर्ताओं के अलग-अलग डिफ़ॉल्ट समूह होने पर सही उत्तर
Pat

सेटगिड बिट को एक डायरेक्टरी पर सेट करने से उन फ़ाइलों का कारण बनेगा जो उपयोगकर्ता निर्देशिका के समान समूह स्वामित्व प्राप्त करने के लिए बनाते हैं (यदि उपयोगकर्ता उस समूह से संबंधित हैं)। भले ही वह उपयोगकर्ताओं का डिफ़ॉल्ट समूह न हो। फिर इस हुक की जरूरत नहीं है। यह @ वोमबल का जवाब है (और उस पर मेरी टिप्पणी)।
२२

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

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

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

2

आप भंडार को साझा करने के लिए गिट-डेमन का उपयोग कर सकते हैं। अधिक जानकारी के लिए git-daemon के लिए प्रलेखन पढ़ें ।

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

साथ ही इस लेख को अपने गिट रिपॉजिटरी को साझा करने के 8 तरीकों की जाँच करें ।


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 Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.