2012-07-20 8 views
14

मुझे गिट के साथ कोई समस्या है। मैंने Google और StackOverflow में एक समाधान की खोज की लेकिन कुछ भी मदद नहीं करता है।गिट परिवर्तन डिफ़ॉल्ट umask जब फ़ाइल अद्यतन करें

समस्या यह है कि हर बार गिट कामकाजी निर्देशिका में कुछ फ़ाइल अपडेट करता है (जब मैं चेकआउट शाखाएं या मैं शाखा को विलय करता हूं) तो फाइल अनुमतियां बदल दी जाती हैं जैसे कि "समूह के लिए लिखने योग्य" ध्वज जोड़ा जाता है। और मेरा अपाचे फ़ाइल के लिए "त्रुटि 500" दिखाता है यदि यह समूह के लिए लिखने योग्य है।

उदाहरण: मेरे पास एक फ़ाइल index.php है। अनुमतियां हैं "-rwxr-xr-x"। वर्तमान (सक्रिय) शाखा मास्टर है। यह फ़ाइल "विकास" शाखा में बदल दी गई थी। मैं "गिट चेकआउट विकसित" निष्पादित करता हूं और फ़ाइल index.php अनुमतियां प्राप्त करता है "-rwxrwxr-x" (समूह के लिए लिखने योग्य है)। और मेरी साइट काम करना बंद कर देती है। चूंकि अपाचे इस ध्वज को php फ़ाइलों में अनुमति नहीं देता है (मुझे नहीं पता कि क्यों, लेकिन मैं इसे बदल नहीं सकता)।

हर बार जब मैं "गिट चेकआउट विकसित" निष्पादित करता हूं तो मुझे "chmod g-w index.php" निष्पादित करने की आवश्यकता होती है। मैं दो आदेशों को निष्पादित करना पसंद नहीं करता (और कभी-कभी मैं इसे निष्पादित करना भूल जाता हूं और मेरी साइट काम नहीं करती है)।

इस समस्या को हल करने के लिए मैं क्या कर सकता हूं? मुझे लगता है कि यह उमास्क से संबंधित कुछ है। मैंने वेब पर कुछ चालें कीं, लेकिन कुछ भी काम नहीं करता है।

धन्यवाद।

+1

क्या कोई कारण है कि आप अपना उमास्क उचित रूप से सेट नहीं कर सकते (यानी 0022 या इसी तरह के)? –

+0

यह कैसे करें? उमास्क सेट करने के लिए? क्या यह प्रणाली बदलती है या केवल गिट बदलती है? अगर सिस्टम है तो मैं इसे –

+1

नहीं बदल सकता बस 'उमास्क 0022' चलाएं। इसे इंटरैक्टिव सत्रों के लिए सेट करने के लिए यह आदेश आपके '.bashrc' या खोल के बराबर में रखें। इसे हमेशा सेट करने के लिए, लेकिन यह आपके '.profile' में है। –

उत्तर

5

त्वरित उत्तर यह शेल फ़ंक्शन आपके ~/.profile में रखा जाना है। एक स्पष्टीकरण निम्नानुसार है।

git(){(umask 0022; command git "[email protected]")} 

umask एक प्रक्रिया की संपत्ति है। यह मूल प्रक्रिया से विरासत में मिला है और बाद में अंदर से बदला जा सकता है। उमास्क को बदलने का आदेश आमतौर पर उमास्क भी नामित होता है।

गिट के पास अपना उमास्क सेट करने के लिए कोई कॉन्फ़िगरेशन विकल्प नहीं है, यह निष्पादित होने के बाद अपना उमास्क नहीं बदलता है। आपको गिट के उमास्क को बाहर से सेट करना होगा, इसे मूल प्रक्रिया से प्राप्त किया जाना चाहिए (आमतौर पर एक खोल)।

एमएमएम, आप इस विचार को नापसंद करते हैं कि गिट को छोड़कर कुछ भी umask बदल गया है। इसलिए git निष्पादित करते समय इसे बदल दें।

जब कोई खोल एक रेखा निष्पादित करता है, तो यह लाइन पर पहला शब्द लेता है और उस नाम के फ़ंक्शन को खोजने का प्रयास करता है। केवल अगर कोई नहीं है, तो वह उस नाम के कमांड को PATH में ढूंढने का प्रयास करता है। ऊपर लिखा गया फ़ंक्शन git नाम दिया गया है, इसलिए git का कोई भी प्रत्यक्ष आमंत्रण अब git कमांड के बजाय निष्पादित करता है।

फ़ंक्शन एक सबहेल निष्पादित करता है, इसके उमास्क को बदलता है और सबहेल के अंदर से git कमांड निष्पादित करता है। गिट अपने काम को खत्म करने के बाद, सबहेल भी निकलता है और मूल खोल उदाहरण में अभी भी मूल उमास्क होगा।

हालांकि, फ़ंक्शन यह भी दिखाता है कि कैसे स्वयं को बाईपास करना है। यदि आप git पर command git या /usr/bin/git के माध्यम से भी कॉल करते हैं, तो फ़ंक्शन नहीं कहा जाएगा। किसी भी सभ्य उपयोग के लिए यह काफी अच्छा है, यद्यपि।

0

चेकआउट के बाद फ़ाइल मोड को बदलने के लिए हुक का उपयोग करना पहले से ही ठीक होने के बाद समस्या को ठीक कर रहा है। हुक निष्पादित करते समय आपके पास पहले से ही फाइल सिस्टम में खराब फ़ाइल मोड है। यदि अनुरोध चेकआउट और हुक निष्पादन के बीच आता है, तो सर्वर 500 त्रुटि के साथ जवाब देगा। लेकिन आप इस समाधान में वैसे भी रुचि रखते हैं।

आपको आवश्यक सभी फ़ाइलों पर हुक chmod g-w चलाने की आवश्यकता है। हुक .git/hooks/post-checkout है, निष्पादन योग्य होना चाहिए और वर्तमान पैरामीटर (खोल में $ 2) के रूप में वर्तमान HEAD प्राप्त हो सकता है। हुक ऐसा दिखाई दे सकता:

#!/bin/bash 
git ls-files -z --with-tree="$2" | xargs -0 chmod g-w -- 

के रूप में हुक फ़ाइलों की सूची नहीं मिलता है की जाँच की, यह सबसे अच्छा कार्यान्वयन संभव हो सकता है। यह वर्तमान HEAD में सभी फ़ाइलों का मोड बदलता है।

7

फ़ाइल निष्पादन को द्विआधारी के रूप में अनुमति देने के लिए यह खतरनाक है। वैसे भी मैंने उमास्क के साथ समस्या हल की।

!/bin/sh 
umask 002 
GIT_WORK_TREE=/var/www/site git checkout -f 

तो, file permission रों 664 करने के लिए सेट और 775 को directory permissions सेट है, जो मुझे पूरी तरह से सूट: मेरी post-receive स्क्रिप्ट तरह दिखता है।

पीएस .profilegit की फ़ाइल में umask सेट करने से उपयोगकर्ता का कोई प्रभाव नहीं पड़ता है, और मुझे समझ में नहीं आता है, अगर आप जानते हैं कि ऐसा क्यों होता है तो कृपया टिप्पणी करें।

3

बैकपोर्टेड जेनियल संस्करण 4.x लिनक्स कर्नेल का उपयोग करते हुए उबंटू 14.04 (ट्रस्टी) पर एनएफएस के माध्यम से घुड़सवार घर निर्देशिका में रेपो की जांच करते समय मैं इस समस्या को मार रहा हूं। स्थानीय निर्देशिका में गिट क्लोन ठीक था। और भी अजीब: एक दूसरा उबंटू 14.04 सर्वर एक ही घुड़सवार निर्देशिका पर एक ही समस्या प्रदर्शित नहीं करता था।

बहुत सारे पोकिंग के बाद मैं उस स्ट्रिंग का उपयोग करने में सक्षम था जिसे गिट ने ओपन() सिस्टम कॉल कहा था, प्रत्येक फ़ाइल को O_CREAT, O_WRONLY और O_EXCL और 0666 के मोड के साथ बनाने के लिए कॉल किया गया था, लेकिन फिर अगला syscal था फ़ाइल के खिलाफ fstat() और मुझे बताया कि यह मोड 0700 था। मेरे मामले में समस्या केवल रेपो में कुछ फाइलों को प्रभावित करती है। अधिकांश फाइलों के लिए मोड 0644 दिखाते हुए 'गिट एलएस-इंडेक्स' के बावजूद, उनमें से कुछ सही तरीके से बनाए जा रहे थे और अन्य नहीं; हालांकि यह हमेशा वही फाइलें थीं जिनके क्लोन पर गलत अनुमतियां थीं। (4.4.0-59 से) 4.4.0-98 को https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1654288

गिरी को अपग्रेड करने के लिए इस तय:

मैंने देखा दो प्रणालियों के बीच कर्नेल संस्करण में एक अंतर नहीं था और उसके बाद निम्न बग की खोज की मुझे। मैंने कुछ होस्ट अभी भी संस्करण 3.x लिनक्स कर्नेल का उपयोग करके जांच की है और इन्हें समस्या नहीं है।

संबंधित मुद्दे