यदि Git यह रिपोर्ट करता है कि आपके Mac पर कोई फ़ाइल एक्ज़ीक्यूटेबल बन गई है—या एक्ज़ीक्यूटेबल होना बंद हो गई है—तो सबसे पहले यह पता लगाएं कि किस स्तर (layer) पर बदलाव हुआ है: वर्किंग फ़ाइल, स्टेजिंग इंडेक्स, या कोई कमिट। अनुमतियों या Git कॉन्फ़िगरेशन को बदलने से पहले उन स्थितियों की तुलना करें। Git सामान्य फ़ाइलों को मोड 100644 (एक्ज़ीक्यूटेबल नहीं) या 100755 (एक्ज़ीक्यूटेबल) के रूप में रिकॉर्ड करता है; उनके बीच का एक अलग बदलाव आमतौर पर एक्ज़ीक्यूटेबल बिट की ओर संकेत करता है, न कि बदली हुई फ़ाइल सामग्री की ओर। Git का diff दस्तावेज़
1. जांचें कि क्या परिवर्तन स्टेज (staged) किया गया है
टर्मिनल में, रिपॉजिटरी पर जाएं और इसकी स्थिति (status) तथा दोनों diffs का निरीक्षण करें:
git status --short
git diff --summary
git diff --cached --summary
git diff वर्किंग ट्री की तुलना इंडेक्स से करता है; git diff --cached इंडेक्स की तुलना HEAD से करता है। Git status इन समान स्तरों में अंतर करता है, इसलिए एक स्टेज किया गया परिवर्तन अनस्टेज किए गए परिवर्तन से अलग दिखाई देता है। Git status दस्तावेज़
mode change 100644 => 100755 path/to/file जैसे आउटपुट की तलाश करें। यदि यह केवल git diff --summary में दिखाई देता है, तो वर्किंग फ़ाइल इंडेक्स से भिन्न है। यदि यह git diff --cached --summary में दिखाई देता है, तो मोड परिवर्तन स्टेज हो चुका है और इसे कमिट किया जा सकता है। यदि दोनों खाली हैं लेकिन टीम का कोई सदस्य कमिट किए गए परिवर्तन की रिपोर्ट करता है, तो आगे इतिहास (history) का निरीक्षण करें।
2. इंडेक्स की तुलना Mac फ़ाइल से करें
ट्रैक किए गए पाथ के लिए, इंडेक्स के रिकॉर्ड किए गए मोड और फ़ाइल की वर्तमान अनुमतियों का निरीक्षण करें:
git ls-files --stage -- "scripts/build.sh"
ls -l "scripts/build.sh"
scripts/build.sh को सटीक रिपॉजिटरी-रिलेटिव पाथ से बदलें; इसे उद्धरण चिह्नों (quotes) में रखें ताकि स्पेस और शेल वर्णों को अक्षरशः माना जाए। git ls-files --stage आउटपुट में, पहला फ़ील्ड इंडेक्स में संग्रहीत मोड होता है: 100644 का अर्थ है कि Git फ़ाइल को एक्ज़ीक्यूटेबल के रूप में रिकॉर्ड नहीं करता है, जबकि 100755 का अर्थ है कि वह करता है। ls -l आउटपुट स्थानीय अनुमति बिट्स दिखाता है; अनुमति ट्रिपलेट में x उपयोगकर्ताओं के उस वर्ग के लिए एक्ज़ीक्यूट अनुमति को इंगित करता है। Git ls-files दस्तावेज़ और Apple की अनुमतियों से संबंधित गाइड इन दोनों दृष्टिकोणों की व्याख्या करते हैं।
यह तुलना कारण को सीमित करती है। यदि इंडेक्स 100644 कहता है, लेकिन ls -l एक्ज़ीक्यूट अनुमति दिखाता है, तो विसंगति वर्किंग फ़ाइल में है (या Git को फ़ाइल-मोड अंतरों को अनदेखा करने के लिए कॉन्फ़िगर किया गया है)। यदि इंडेक्स 100755 कहता है, तो Git पहले ही एक्ज़ीक्यूटेबल मोड को स्टेज या चेक आउट कर चुका है, भले ही आप फ़ाइल को किसी भी रूप में रखना चाहते हों।
3. उस कमिट को खोजें जिसने मोड पेश किया था
यदि परिवर्तन पहले से ही इतिहास में है, तो संबंधित फ़ाइल के कमिट सारांशों की जांच करें:
git log --summary -- "scripts/build.sh"
जब किसी फ़ाइल का मोड बदलता है, तो Git का पैच प्रारूप अलग-अलग old mode और new mode हेडर प्रिंट करता है। उस कमिट की समीक्षा करें जहां वे मान बदलते हैं, फिर उसके पैरेंट और आस-पास के वर्कफ़्लो की तुलना करें: क्या फ़ाइल को जानबूझकर चलाने योग्य (runnable) बनाया गया था, क्या किसी एडिटर या स्क्रिप्ट ने अनुमतियाँ बदल दीं, या रिपॉजिटरी का उपयोग किसी अन्य फ़ाइल सिस्टम या ऑपरेटिंग सिस्टम पर किया गया था? कमिट यह पहचानता है कि Git ने परिवर्तन कब रिकॉर्ड किया; यह यह साबित नहीं करता कि किस एप्लिकेशन या व्यक्ति ने ऐसा किया। Git diff प्रारूप दस्तावेज़
कई असंबंधित फ़ाइलों में मोड परिवर्तन एक व्यापक अनुमति-सेटिंग ऑपरेशन या फ़ाइल सिस्टम/पर्यावरण संक्रमण का संकेत दे सकता है। Git दस्तावेज़ बताते हैं कि कुछ फ़ाइल सिस्टम एक्ज़ीक्यूटेबल बिट्स को संरक्षित करने में विफल रहते हैं, और यह कि वातावरणों के बीच स्थानांतरित रिपॉजिटरी विभिन्न फ़ाइल-मोड व्यवहार का सामना कर सकती है। इसे जांचने के लिए एक सुराग के रूप में मानें, किसी विशिष्ट कारण का प्रमाण नहीं। Git कॉन्फ़िगरेशन दस्तावेज़
4. Git की फ़ाइल-मोड सेटिंग की जांच करें
सेटिंग और यह कहां से आ रही है, इसकी जांच करें:
git config --show-origin --get core.filemode
core.filemode यह नियंत्रित करता है कि क्या Git वर्किंग ट्री में एक्ज़ीक्यूटेबल-बिट अंतरों का सम्मान करता है। जब अनिर्दिष्ट हो, तो Git इसे डिफ़ॉल्ट रूप से true पर सेट करता है और रिपॉजिटरी के इनिशियलाइज़ या क्लोन होने पर फ़ाइल सिस्टम व्यवहार की जांच कर सकता है। यदि कमांड false प्रिंट करता है, तो Git स्थानीय एक्ज़ीक्यूटेबल-बिट परिवर्तनों को अनदेखा कर सकता है; वह सेटिंग किसी कमिट में पहले से रिकॉर्ड किए गए मोड की व्याख्या नहीं करती है। यदि यह कुछ भी प्रिंट नहीं करता है, तो सेटिंग अनसेट हो सकती है, ऐसी स्थिति में Git का प्रलेखित डिफ़ॉल्ट लागू होता है। Git कॉन्फ़िगरेशन दस्तावेज़
केवल एक अप्रत्याशित diff को छिपाने के लिए इस विकल्प को false पर सेट करने से बचें। पहले पुष्टि करें कि क्या रिपॉजिटरी किसी ऐसे फ़ाइल सिस्टम या शेयर्ड सेटअप पर है जो एक्ज़ीक्यूटेबल बिट्स को मज़बूती से संरक्षित नहीं करता है, और क्या सहयोगी मोड ट्रैकिंग पर निर्भर हैं। सेटिंग बदलने से मोड अंतरों को संभालने का Git का तरीका बदल जाता है; यह इंडेक्स या कमिट में गलत तरीके से रिकॉर्ड किए गए मोड को ठीक नहीं करता है।
5. इच्छित मोड की पहचान करने के बाद ही सुधारें
यदि फ़ाइल को एक्ज़ीक्यूटेबल नहीं होना चाहिए और परिवर्तन अनस्टेज है, तो chmod के साथ स्थानीय अनुमति पुनर्स्थापित करें:
chmod a-x "scripts/build.sh"
git diff --summary
यदि इच्छित मोड एक्ज़ीक्यूटेबल है, तो इसके बजाय chmod a+x "scripts/build.sh" का उपयोग करें। macOS पर, chmod निर्दिष्ट आइटम की अनुमतियों को बदलता है; इच्छित मोड को फ़ाइल की भूमिका और रिपॉजिटरी की परंपरा के आधार पर चुनें, न कि केवल diff को गायब करने के लिए। Apple की अनुमतियों से संबंधित गाइड
यदि कोई गलत मोड स्टेज किया गया है, तो इच्छित स्थानीय अनुमति सेट करें, फिर उस पाथ को फिर से स्टेज करें और स्टेज किए गए सारांश की समीक्षा करें:
chmod a-x "scripts/build.sh"
git add -- "scripts/build.sh"
git diff --cached --summary
जब फ़ाइल को एक्ज़ीक्यूटेबल होना चाहिए, तो a-x के स्थान पर a+x का उपयोग करें। यदि किसी मौजूदा कमिट में मोड गलत है, तो शेयर्ड इतिहास को फिर से लिखने की तुलना में एक नया सुधारात्मक कमिट आमतौर पर अधिक स्पष्ट होता है; ऐसे कमिट्स को फिर से लिखने से पहले समन्वय करें जिनका अन्य लोग पहले से उपयोग कर रहे हों। हर मामले में, बाद में git diff और git diff --cached का निरीक्षण करें ताकि आप अनुमति परिवर्तन के साथ सामग्री संपादन को अनदेखा न करें।
स्रोत
Git - git-diff दस्तावेज़ — Git
BSD अनुमतियाँ और स्वामित्व — Apple Developer