मैं Git को फ़ाइल मोड (chmod) परिवर्तनों को अनदेखा कैसे करूँ?


2308

मेरे पास एक परियोजना है जिसमें मुझे chmodविकसित होते समय 777 के साथ फ़ाइलों का मोड बदलना होगा , लेकिन जिसे मुख्य रेपो में नहीं बदलना चाहिए।

Git पिक अप करता है chmod -R 777 .और सभी फाइलों को बदल देता है। क्या Git को मोड में अनदेखा करने का कोई तरीका है जो फ़ाइलों में किया गया है?


17
यह उपयोगी है जब विंडोज पर उबंटू पर विंडोज + बैश पर काम करने के साथ
एलारज

4
किसी के लिए जो केवल एक विशिष्ट आह्वान के लिए अनुमति परिवर्तनों को अनदेखा करना चाहता है git diff, और जो इसलिए अपनी गिट कॉन्फ़िगरेशन फ़ाइलों को बदलना नहीं चाहता है: आप यहां जेड के जवाब के git diff -G.अनुसार उपयोग कर सकते हैं
sampablokuper

जवाबों:


3818

प्रयत्न:

git config core.fileMode false

से Git-config (1) :

core.fileMode
    Tells Git if the executable bit of files in the working tree
    is to be honored.

    Some filesystems lose the executable bit when a file that is
    marked as executable is checked out, or checks out a
    non-executable file with executable bit on. git-clone(1)
    or git-init(1) probe the filesystem to see if it handles the 
    executable bit correctly and this variable is automatically
    set as necessary.

    A repository, however, may be on a filesystem that handles
    the filemode correctly, and this variable is set to true when
    created, but later may be made accessible from another
    environment that loses the filemode (e.g. exporting ext4
    via CIFS mount, visiting a Cygwin created repository with Git
    for Windows or Eclipse). In such a case it may be necessary
    to set this variable to false. See git-update-index(1).

    The default is true (when core.filemode is not specified
    in the config file).

-cझंडा एक बंद आदेश के लिए यह विकल्प सेट करने के लिए इस्तेमाल किया जा सकता:

git -c core.fileMode=false diff

और --globalध्वज यह उपयोगकर्ता में लॉग इन के लिए डिफ़ॉल्ट व्यवहार करेगा।

git config --global core.fileMode false

वैश्विक सेटिंग के परिवर्तन मौजूदा रिपॉजिटरी पर लागू नहीं होंगे। साथ ही, git cloneऔर git initस्पष्ट रूप से सेट core.fileModeकरने के लिए trueरेपो कॉन्फिग के रूप में चर्चा की क्लोन पर Git वैश्विक core.fileMode झूठी ओवरराइड स्थानीय स्तर पर

चेतावनी

core.fileModeसबसे अच्छा अभ्यास नहीं है और इसे सावधानी से इस्तेमाल किया जाना चाहिए। यह सेटिंग केवल निष्पादन योग्य मोड को कवर करती है और कभी भी बिट / रीड बिट्स को नहीं पढ़ती है। कई मामलों में आपको लगता है कि आपको इस सेटिंग की आवश्यकता है क्योंकि आपने कुछ ऐसा किया है chmod -R 777, जिससे आपकी सभी फाइलें निष्पादन योग्य हो जाती हैं। लेकिन अधिकांश परियोजनाओं में अधिकांश फ़ाइलों की आवश्यकता नहीं होती है और सुरक्षा कारणों से निष्पादन योग्य नहीं होनी चाहिए

इस तरह की स्थिति को हल करने का उचित तरीका फ़ोल्डर और फ़ाइल अनुमति को अलग से संभालना है, जैसे कुछ:

find . -type d -exec chmod a+rwx {} \; # Make folders traversable and read/write
find . -type f -exec chmod a+rw {} \;  # Make files read/write

यदि आप ऐसा करते हैं, तो आपको core.fileModeबहुत दुर्लभ वातावरण को छोड़कर, कभी भी उपयोग करने की आवश्यकता नहीं होगी ।


203
यदि आप ऐसा करते हैं git config --global core.filemode falseतो आपको केवल सभी रेपो के लिए एक बार ऐसा करने की आवश्यकता होगी।
ग्रेग

13
यह मेरे लिए तब तक काम नहीं करता था जब तक मैंने मामला तय नहीं किया है यह फाइलमोड के बजाय होना चाहिए
tishma

8
@tishma: Git कॉन्फ़िगरेशन सेक्शन और वेरिएबल के नाम डॉक्यूमेंट के अनुसार असंवेदनशील हैं, CONFIGURATION FILE सेक्शन को देखें , इसलिए यदि ऊपर वाला आपके लिए काम नहीं करता है तो यह एक अलग कारण के लिए था।
ग्रेग हेविगेल

11
@donquixote: git configकमांड सही कॉन्फ़िगरेशन फ़ाइल के लिए सेटिंग लिखता है ( .git/configकेवल वर्तमान रिपॉजिटरी के लिए, या ~/.gitconfigयदि उपयोग किया जाता है --global)।
ग्रेग हेवगिल

8
@ zx1986: इससे कोई फर्क नहीं पड़ता। से Git config : "चर नाम केस-संवेदी होते हैं, ..."
ग्रेग Hewgill

277

काम के पेड़ में पूर्ववत बदलाव

git diff --summary | grep --color 'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -d'\n' chmod +x
git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -d'\n' chmod -x

या मिंगव-गित में

git diff --summary | grep  'mode change 100755 => 100644' | cut -d' ' -f7- | xargs -e'\n' chmod +x
git diff --summary | grep  'mode change 100644 => 100755' | cut -d' ' -f7- | xargs -e'\n' chmod -x

42
OS X Lion पर, उस -d'\n'हिस्से को छोड़ दें xargsक्योंकि यह एक अवैध तर्क है (और इसकी आवश्यकता नहीं है)।
पास्कल

9
आप "chmod: गुम ऑपरैंडंड के बाद` + x 'के बारे में किसी भी त्रुटि को अनदेखा कर सकते हैं
केसी वॉटसन

5
क्या यह आज तक है?
मिंगव

7
@Pascal @pimlottc -d किसी भी व्हाट्सएप के बजाय परिसीमन को नईलाइन के रूप में निर्दिष्ट करता है। BSD xargs के पास वह विकल्प नहीं है, लेकिन इसके बजाय आप आउटपुट को पाइप कर सकते हैं tr '\n' '\0'और फिर -0NUL को सीमांकक के रूप में उपयोग करने के लिए xggs का उपयोग कर सकते हैं।
मार्क ऑलफिक

10
कूल, trबात काम की! यहाँ OSX के लिए पूरी कमान है:git diff --summary | grep --color 'mode change 100644 => 100755' | cut -d' ' -f7-|tr '\n' '\0'|xargs -0 chmod -x
के।-माइकल ऐई

135

यदि आप अपने सभी रिपॉजिट के लिए इस विकल्प को सेट करना चाहते हैं, तो --globalविकल्प का उपयोग करें ।

git config --global core.filemode false

यदि यह काम नहीं करता है तो आप शायद गिट के एक नए संस्करण का उपयोग कर रहे हैं इसलिए --addविकल्प का प्रयास करें ।

git config --add --global core.filemode false

यदि आप इसे -global विकल्प के बिना चलाते हैं और आपकी कार्यशील निर्देशिका कोई रेपो नहीं है, तो आपको मिलेगा

error: could not lock config file .git/config: No such file or directory

5
ऐसा लगता है कि बाद में जीआईटी का उपयोग होता है --add, जैसे किgit config --add --global core.filemode false
10

14
यदि रेपो के स्थानीय कॉन्फिगरेशन में पहले से ही फिलोडोड = सच है तो ग्लोबल कॉन्फिग को बदलने में मदद नहीं मिलेगी क्योंकि लोकल कॉन्फिगरेशन ग्लोबल कॉन्फिगरेशन को ओवरराइड कर देगा। मशीन के प्रत्येक रेपो के स्थानीय विन्यास को एक बार बदलना होगा
रकीब

3
कृपया: syedrakib की चेतावनी के साथ इस उत्तर को अपडेट करें! इससे पहले कि मैं इसे पाया सब कुछ पागल हो गया, और बाद में सही समझ में आया।
जर्कलार्क

88

अगर

git config --global core.filemode false

आपके लिए काम नहीं करता है, इसे मैन्युअल रूप से करें:

cd into yourLovelyProject folder

cd .git फ़ोल्डर में:

cd .git

कॉन्फ़िग फ़ाइल संपादित करें:

nano config

सच को झूठ में बदलो

[core]
        repositoryformatversion = 0
        filemode = true

->

[core]
        repositoryformatversion = 0
        filemode = false

सहेजें, बाहर निकलें, ऊपरी फ़ोल्डर पर जाएं:

cd ..

पकड़ मजबूत करें

git init

आप कर चुके हैं!


11
संपादन के बजाय .git/config, git config core.fileMode falseआपके प्रोजेक्ट की जड़ में एक सरल पर्याप्त है। यदि आप कॉन्फ़िगर फ़ाइल को संपादित करते हैं, तो आप निर्देश को पूरी तरह से हटा सकते हैं, ताकि वैश्विक एक को उठाया जाए।
फेलिक्स

6
-1 अगर git config --global काम नहीं करता है तो इसका मतलब है कि आपके पास इसे सिस्टम स्तर पर करने की अनुमति नहीं है, हटाने का globalविकल्प बिल्कुल वैसा ही है जैसा कि मैन्युअल रूप से संपादन के लिए होता है। इसे / config
CharlesB

@CharlesB गलत - उत्तर ने परियोजना में सीधे विकल्प डालकर एक वैकल्पिक हल प्रदान किया, जिससे यह परियोजना-विशिष्ट हो गया। यह अन्य git प्रोजेक्ट्स के साथ काम नहीं करेगा जो आप भविष्य में बनाते हैं / चेकआउट करते हैं, लेकिन जिस प्रोजेक्ट पर आप काम कर रहे हैं, उसके लिए काम नहीं करता है। (आइए सुनिश्चित करें कि हम अवज्ञा करते हैं ~/.gitconfig, और ~/project/.git/config)
ddavison

एक बार यह चलने के बाद git initक्या हमें फिल्ममोड को सही पर सेट करना चाहिए?
जॉर्डन

53

ग्रेग Hewgill उत्तर में जोड़ने ( core.fileModeविन्यास चर का उपयोग कर ):

आप अनुक्रमणिका में निष्पादन अनुमतियों को बदलने के लिए git अपडेट-इंडेक्स ("git add" के निम्न-स्तरीय संस्करण) के --chmod=(-|+)xविकल्प का उपयोग कर सकते हैं , जहाँ से यदि आप "git कमिट" (और "git कमिट-ए) का उपयोग करते हैं तो इसे उठाया जाएगा। ")।


2
इसे ग्रेग हेगिल के उत्तर में एक अलग उत्तर के रूप में जोड़ा जाना चाहिए था, इस प्रकार एक एकल निरूपण प्रतिनिधित्व के साथ एक सर्वोच्च उत्तर बनाया गया।
ग्रेग

6
@Greg: किसी के पास स्वयं के उत्तर को संपादित करने के लिए पर्याप्त अंक होने चाहिए; मुझे लगता है कि मेरे पास उस समय संपादन की अनुमति के लिए पर्याप्त नहीं था।
जैकब नार Jakबस्की

1
@ जैकब मुझे लगता है कि अब आपके पास पर्याप्त प्रतिष्ठा है :) उदाहरण फ़ाइल के लिए यह कमांड कैसा दिखेगा?
एलेक्स हॉल

38

आप इसे विश्व स्तर पर कॉन्फ़िगर कर सकते हैं:

git config --global core.filemode false

यदि उपरोक्त आपके लिए काम नहीं करता है, तो इसका कारण आपका स्थानीय कॉन्फ़िगरेशन वैश्विक कॉन्फ़िगरेशन को ओवरराइड कर सकता है।

वैश्विक कॉन्फ़िगरेशन को प्रभावी बनाने के लिए अपना स्थानीय कॉन्फ़िगरेशन निकालें:

git config --unset core.filemode

वैकल्पिक रूप से, आप अपने स्थानीय कॉन्फ़िगरेशन को सही मान में बदल सकते हैं:

git config core.filemode false


4
यदि मुख्य उत्तर आपकी सहायता नहीं करता है - तो इसे आज़माएँ। यदि आप इसे संशोधित किए बिना अपना स्थानीय कॉन्फ़िगरेशन चेक करना चाहते हैं, तो चेक करें git config -l(सूची वर्तमान कॉन्फ़िगर - स्थानीय और वैश्विक दोनों)
Krzysztof Bociurko

23

यदि आपने पहले से ही chmod कमांड का उपयोग किया है तो फ़ाइल के अंतर की जांच करें, यह पिछले फ़ाइल मोड और वर्तमान फ़ाइल मोड जैसे:

नई विधा: 755

पुराना मोड: 644

नीचे दिए गए कमांड का उपयोग करके सभी फाइलों का पुराना मोड सेट करें

sudo chmod 644 .

अब core.fileMode को config फाइल में झूठी कमांड पर या कमांड का उपयोग करके सेट करें।

git config core.fileMode false

तब सभी फ़ाइलों की अनुमतियों को बदलने के लिए chmod कमांड को लागू करें

sudo chmod 755 .

और फिर सही पर core.fileMode सेट करें।

git config core.fileMode true

सर्वोत्तम प्रथाओं के लिए core.fileMode को हमेशा गलत न रखें।


क्या आप कह रहे हैं कि एक संपूर्ण परियोजना (विकास, मंचन और उत्पादन में) 755 होनी चाहिए?
डैनियल

@ डैनियल फरवरी: नहीं, केवल आवश्यक फाइलों के मोड को बदल दें।
किशोर विटेकर

For best practises don't Keep core.fileMode false alwaysआपका क्या मतलब है, आपको समझाना चाहिए।
bg17aw

For best practises don't Keep core.fileMode false always.कुछ filesystems (उदाहरण के लिए FAT) फ़ाइल अनुमतियों का समर्थन नहीं करते हैं, इसलिए OS डिफ़ॉल्ट मान (मेरे सिस्टम पर 766 वैसे भी) की रिपोर्ट करेगा। इस मामले core.filemodeमें, स्थानीय कॉन्फ़िगरेशन में बिल्कुल आवश्यक है, जब तक कि आप अनावश्यक और अनजाने में अनुमति परिवर्तन के साथ प्रतिबद्ध इतिहास को ब्लोट नहीं करना चाहते हैं
केविनऑर्र

इसके अलावा, आप परमिट को वापस बदलने की जहमत क्यों उठाते हैं? यदि आप सेट करते हैं core.filemode=falseतो git बिट परिवर्तनों को निष्पादित करने की उपेक्षा करेगा, स्थानीय अनुमतियों को बदलने की कोई आवश्यकता नहीं है। जब तक आप पहले ही अनुक्रमणिका में अनुमति परिवर्तन नहीं कर लेते, तब तक आप जिस चरण को git addबंद करने के बाद आपको आवश्यकता होगी, उस चरण को याद कर रहे हैं core.filemode
केविनऑर

18

निम्नलिखित उपनाम (~ / .itconfig में) को निर्धारित करके आप आसानी से फ़ाइल के प्रति अस्थायी रूप से अक्षम कर सकते हैं।

[alias]
nfm = "!f(){ git -c core.fileMode=false $@; };f"

जब इस उपनाम को git कमांड के लिए उपसर्ग किया जाता है, तो फ़ाइल मोड परिवर्तन कमांड के साथ दिखाई नहीं देंगे जो अन्यथा उन्हें दिखाएंगे। उदाहरण के लिए:

git nfm status

14

यदि आप फिल्म्समोड को झूठा फाइल में पुनरावृत्ति से सेट करना चाहते हैं (सबमॉड्यूल्स सहित): find -name config | xargs sed -i -e 's/filemode = true/filemode = false/'


4
यह काम नहीं करेगा यदि वह लाइन कॉन्फिगर फाइल में नहीं है। यदि आप इसे git submodule foreach git config core.fileMode false
सबमॉड्यूल्स के

4

सरल समाधान:

इस हिट सरल कमांड परियोजना फ़ोल्डर में ( यह अपने मूल परिवर्तन नहीं निकाला जाएगा) ... यह केवल जाएगा परिवर्तनों को निकालने कि कर दिया गया था किया , जबकि आप बदल प्रोजेक्ट फ़ोल्डर अनुमति

आदेश नीचे है:

git config core.fileMode false

यह सभी अनावश्यक फ़ाइल संशोधित क्यों हो जाती है: क्योंकि आपने प्रोजेक्ट फ़ोल्डर अनुमतियाँ बदली हैं sudo chmod -R 777 ./yourProjectFolder के साथ।

जब आप बदलावों की जाँच करेंगे तो आपने क्या नहीं किया? जीआईटी फ़ाइल नाम का उपयोग करते समय आपको नीचे जैसा मिला

old mode 100644
new mode 100755

1

यह मेरे लिए काम करता है:

find . -type f -exec chmod a-x {} \;

या रिवर्स, आपके ऑपरेटिंग सिस्टम पर निर्भर करता है

find . -type f -exec chmod a+x {} \;

1
यह फ़ाइल की अनुमतियाँ बदल देगा, लेकिन git को फ़ाइल की फ़ाइल अनुमतियों को अनदेखा न करें।
डोमडम्ब्रोगिया

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