UNIX समूह द्वारा साझा किए जाने के लिए मौजूदा git रेपो को कैसे कॉन्फ़िगर करें


98

मेरे पास एक मौजूदा गिट रेपो (एक नंगे एक) है जो इस बिंदु तक है मेरे द्वारा केवल लेखन योग्य है। मैं इसे कुछ यूनिक्स उपयोगकर्ता समूह, फू तक खोलना चाहता हूं, ताकि फू के सभी सदस्य इसे पुश कर सकें। मुझे पता है कि मैं आसानी से एक नया git रेपो सेट कर सकता हूँ :

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

लेकिन मुझे मौजूदा रेपो डायर के बराबर ऑपरेशन की जरूरत है ।


4
ServerFault (एक और StackOverflow साइट) पर इस प्रश्न का एक उत्कृष्ट उत्तर है
ज़्यूरिन

जवाबों:


115

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
मुझे लगता है कि आप शायद भी repo के विन्यास में config.saredRepository = true सेट करना चाहिए। kernel.org/pub/software/scm/git/docs/git-config.html
Pistos

1
यह अपने आप में जो मैं कर रहा था उसके बहुत करीब है, लेकिन मैं कुछ बाहरी पुष्टि प्राप्त करना चाहता था। धन्यवाद। :) मैं यह भी उम्मीद कर रहा था कि एक git क्लोन होगा - sared = समूह प्रकार की चीज़, लेकिन क्लोन का - sered विकल्प कुछ पूरी तरह से अलग करता है।
पिस्टोस

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, लेकिन केवल इस पद्धति से त्रुटि से छुटकारा मिला (प्रो। क्योंकि कुछ उपनिर्देशिका में एक फ़ाइल समूह लेखन योग्य नहीं थी?)
विलियम टरेल

2
उपयोगकर्ता का umask अभी भी नव-निर्मित फ़ाइलों पर लागू होता है। यह है कि आप क्या उम्मीद करते हैं? मुझे लगता है कि core.sharedRepositoryयह उल्लेख करने के दस्तावेज़ीकरण होगा - यह लगता है कि उपयोगकर्ताओं के बिना बेकार है उनकी सभी फाइलें समूह को लेखन योग्य बनाती हैं।
सैम ब्राइटमैन

47

रेपो डिर में निम्नलिखित आदेशों पर अमल करें:

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

संपादित करें: अक्सर भ्रम की स्थिति को दूर करने के लिए, groupयह एक वास्तविक कीवर्ड है, आपको इसे समूह के नाम से प्रतिस्थापित करने की आवश्यकता नहीं है।


25
groupसमूह का नाम कहां नहीं है :)
पियरे डी लेस्पिन

7
ऑब्जेक्ट और पैक फाइलें अपरिवर्तनीय होनी चाहिए; उनके पास 444 / r - r - r-- की अनुमति होनी चाहिए।
सीबी बेली

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समूह का नाम नहीं है, लेकिन वास्तविक मूल्य है!
किक्सॉर्ज़

यदि आपने "समूह" के बजाय अपने समूह के नाम का उपयोग करने की गलती की है, तो पाठ संपादक में केवल .git / config खोलें और "समूह" कहने के लिए core.saredRepository लाइन संपादित करें।
टॉम

44

विलय @ दाऊद Underhill और @kixorz जवाब, मैं अपने ही (निश्चित) समाधान कर दिया।

यह नंगे repos और गैर-नंगे repos के लिए है। उनके बीच केवल थोड़े अंतर हैं, लेकिन इस तरह से स्पष्ट है।

बेयर रिपॉजिटरी

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/
पूर्वसर्ग

यहाँ हम समूह का नाम कैसे पा सकते हैं या समूह का नाम कैसे बना सकते हैं?
सुजीतराव

'chmod g + s find . -type d' त्रुटि उठाती हैunable to execute /bin/chmod: Argument list too long
डॉक्स

जैसा कि @ डॉएक्स ने उल्लेख किया है, chmod g+s `find . -type d`स्केल नहीं करता है। उपयोगfind -type d -exec chmod g+s {} +
हैगेलो

मुझे लगता है कि सभी ढीली वस्तुओं को भी केवल पूर्व-साझा स्थिति के आधार पर पढ़ा जाना चाहिए। शायद कुछ ऐसा chmod g-w objects/*/*। मैं जानकारी के बारे में निश्चित नहीं हूँ, क्योंकि यह इस रेपो के लिए खाली है।
एरिक

3

यह संभवतः आवश्यक नहीं है, लेकिन यह इंगित करने योग्य है कि denyNonFastForwards विकल्प git init --bare --sharedभी सेट करता है।

git config receive.denyNonFastForwards true

इस विकल्प का अर्थ इस प्रकार है:

receive.denyNonFastForwards

यदि आप यह मानते हैं कि आपने पहले ही धक्का दे दिया है, तो फिर से धक्का देने की कोशिश करें, या अन्यथा एक दूरस्थ शाखा को एक कमिट करने की कोशिश करें जिसमें वह कमिटमेंट नहीं है जो कि रिमोट शाखा वर्तमान में इंगित करती है, तो आपको अस्वीकार कर दिया जाएगा। यह आम तौर पर अच्छी नीति है; लेकिन रिबेस के मामले में, आप यह निर्धारित कर सकते हैं कि आप जानते हैं कि आप क्या कर रहे हैं और अपने पुश कमांड के लिए -f फ्लैग के साथ रिमोट ब्रांच को फोर्स-अपडेट कर सकते हैं।

( http://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration से )


1

एक समूह को पढ़ने / लिखने की अनुमति देने के उपरोक्त उत्तरों के अलावा, आपको उपयोगकर्ता को समूह में जोड़ने की भी आवश्यकता है ("फू" कहें)।

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

ध्यान दें: आपको पहले उपयोगकर्ता बनाना होगा यदि यह मौजूद नहीं है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.