यदि वे संशोधित किए गए हैं तो git के भीतर फ़ाइलों और निर्देशिकाओं की अनुमतियों को कैसे पुनर्स्थापित करें?


278

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

फ़ाइलों की सामग्री को छूने के बिना (बस अनुमतियों को संशोधित करना चाहते हैं) मैं सभी फ़ाइलों की अनुमतियों को कैसे सेट करता हूं कि वे क्या सोचते हैं कि उन्हें क्या होना चाहिए?


जवाबों:


572

Git फ़ाइलप्रोपेक्शन का ट्रैक रखता है और पैच का उपयोग करते समय अनुमति परिवर्तन को उजागर करता है git diff -p। तो हम सभी की जरूरत है:

  1. रिवर्स पैच बनाएं
  2. केवल अनुमति परिवर्तन शामिल करें
  3. पैच को हमारी वर्किंग कॉपी पर लागू करें

एक-लाइनर के रूप में:

git diff -p -R --no-ext-diff --no-color \
    | grep -E "^(diff|(old|new) mode)" --color=never  \
    | git apply

आप इसे अपने git config के उपनाम के रूप में भी जोड़ सकते हैं ...

git config --global --add alias.permission-reset '!git diff -p -R --no-ext-diff --no-color | grep -E "^(diff|(old|new) mode)" --color=never | git apply'

... और आप इसके माध्यम से आह्वान कर सकते हैं:

git permission-reset

ध्यान दें, यदि आप शेल हैं, तो उद्धरणों के बजाय bashउपयोग करना सुनिश्चित करें , अन्यथा यह आपके द्वारा चलाए गए अंतिम कमांड के साथ प्रतिस्थापित हो जाता है ।'"!gitgit

कि बस का उपयोग करके उनका कहना है के लिए @Mixologic को Thx -Rपर git diff, बोझिल sedआदेश नहीं रह गया है की आवश्यकता है।


3
मैं ओएस एक्स में हूं, यह काम नहीं कर रहा है। मैंने पहचान लिया है कि समस्या git लागू करने में है। यह फ़ाइल अनुमति परिवर्तन लागू नहीं करता है।
मिर्च_चिको

15
ओह, यह काम किया, मैं रिपॉजिटरी रूट से अलग एक निर्देशिका से आवेदन करने की कोशिश कर रहा था। git लागू होता है केवल वहाँ काम करता है।
मिर्च_चिको

6
क्या कोई कारण नहीं है कि आप सिर्फ "git diff -p -R" करें, इसके बजाय sed को रिवर्स करने के लिए क्या करें?
मिक्सोलॉजिक

6
@RobQuist अपने स्थानीय परिवर्तन नहीं हटाया गया जब muhqu के आदेश का उपयोग
logion

17
मैं मिल रहा हूँfatal: unrecognized input
तिमे

120

प्रयत्न git config core.fileMode false

से git configआदमी पेज:

core.fileMode

यदि गलत है, तो इंडेक्स और वर्किंग कॉपी के बीच निष्पादन योग्य अंतर को अनदेखा किया जाता है; FAT जैसी टूटी हुई फाइल सिस्टम पर उपयोगी। देखें git-अद्यतन सूचकांक (1)

डिफ़ॉल्ट सही है, सिवाय गिट-क्लोन (1) या गिट-इनिट (1) की जांच करेगा और कोर सेट करेगा। जब सही रिपॉजिटरी बनाई जाती है तो उपयुक्त है।


धन्यवाद, यही मैंने किया। यह काम करता है तो ट्रैकिंग ट्रैकिंग नहीं करने के लिए बहुत प्रयोग किया जाता है।
डेल फ़ॉस्टर

3
@ शवास: मुझे खुशी है कि इससे मदद मिली। लिनक्स और विंडोज के बीच रेपो साझा करते समय मैंने एक समान समस्या का अनुभव किया। BTW: यदि यह आपके प्रश्न का उत्तर देता है, तो कृपया प्रतिक्रिया को सही मानें।
टिम हेनिगन

क्या यह संभव है कि git checkout origin/masterसर्वर के लिए प्रतिबद्ध फ़ाइल अनुमतियों को मेरी स्थानीय कार्य प्रतिलिपि में सेट किया जाए? क्योंकि जब भी मैं ArangoDB के लिए V8 का निर्माण करता हूं, तो फ़ाइल अनुमतियों को बदल दिया जाता है ताकि पूरे बिल्ड फ़ोल्डर तक पहुंच से इनकार कर दिया जाए (यहां तक ​​कि उन्नत अधिकारों के साथ; विंडोज 7+ जो है)। बिल्ड प्रक्रिया को जारी रखने से पहले मुझे सभी स्थानीय फ़ाइल अनुमतियों को ठीक करने की आवश्यकता है। उसे core.filemode falseभी ठीक कर सकते हैं? मुझे शक है कि मेरी विंडोज मशीन पर लिनक्स की अनुमति है। बिल्ड स्क्रिप्ट बस उन्हें संरक्षित कर सकती है और नई बनाई गई फ़ाइलों के लिए एक ही अनुमतियाँ लागू कर सकती हैं ...
CodeManX

मैं सोच रहा था कि वहाँ स्थापित filemodeकरने के लिए कोई नकारात्मक पहलू है false!
केवोरॉयड

11

Git निष्पादन योग्य स्क्रिप्ट के अलावा फ़ाइल अनुमतियों को संग्रहीत नहीं करता है। फ़ाइल स्वामित्व और अनुमतियां सहेजने के लिए git-cache-meta जैसी किसी चीज़ का उपयोग करने पर विचार करें ।

Git केवल दो प्रकार के मोड को स्टोर कर सकता है: 755 (निष्पादन योग्य) और 644 (निष्पादन योग्य नहीं)। अगर आपकी फ़ाइल 444 git होती तो वह 644 होती।


14
क्षमा करें, लेकिन यह गलत है। Git, वास्तव में, अनुमति ट्रैक करता है।
विल

4
यह लगभग सटीक है, git.wiki.kernel.org/index.php/ContentLimitations देखें । सर्वर और संभवतः क्लाइंट के umaskसाथ-साथ कॉन्फ़िगरेशन सेटिंग के आधार पर सेट की जाने वाली सटीक अनुमतियां स्टैकओवरफ़्लो . com/a/12735291/125150 देखें ।
मोति स्ट्रोम

12
@ नहीं, यह नहीं है। विश्वास नहीं हो सकता है कि आपकी टिप्पणी को बहुत सारे बदलाव मिले।
eis

@Will, यह मोटे तौर पर सही है। प्रति डॉक्स ...a mode of 100644, which means it’s a normal file. Other options are 100755, which means it’s an executable file; and 120000, which specifies a symbolic link. The mode is taken from normal UNIX modes but is much less flexible — these three modes are the only ones that are valid for files (blobs) in Git (although other modes are used for directories and submodules).
कृपया

9
git diff -p \
| grep -E '^(diff|old mode|new mode)' \
| sed -e 's/^old/NEW/;s/^new/old/;s/^NEW/new/' \
| git apply

ज्यादातर मामलों में काम करेगा, लेकिन अगर आपके पास बाहरी अलग-अलग उपकरण हैं जैसे कि मेल्ड इंस्टाल आपको एड -नो-एक्सट-डिफरेंट जोड़ना होगा

git diff --no-ext-diff -p \
    | grep -E '^(diff|old mode|new mode)' \
    | sed -e 's/^old/NEW/;s/^new/old/;s/^NEW/new/' \
    | git apply

मेरी स्थिति में जरूरत थी



0

मैं विंडोज पर साइबरविन से गिट का उपयोग करता हूं, git applyसमाधान मेरे लिए काम नहीं करता है। यहां मेरा समाधान है, chmodइसकी अनुमतियों को रीसेट करने के लिए प्रत्येक फ़ाइल पर चलाएं ।

#!/bin/bash
IFS=$'\n'
for c in `git diff -p |sed -n '/diff --git/{N;s/diff --git//g;s/\n/ /g;s# a/.* b/##g;s/old mode //g;s/\(.*\) 100\(.*\)/chmod \2 \1/g;p}'`
do
        eval $c
done
unset IFS


-1

git diff -pमुहु के उत्तर में प्रयुक्त सभी विसंगतियां नहीं दिख सकती हैं।

  • मैं नहीं था फ़ाइलों के लिए Cygwin में यह देखा
  • मोड परिवर्तनों को पूरी तरह से नजरअंदाज कर दिया core.filemodeजाता है यदि वह है false(जो कि MSysGit के लिए डिफ़ॉल्ट है)

इस कोड के बजाय सीधे मेटाडेटा पढ़ता है:

(set -o errexit pipefail nounset;
git ls-tree HEAD -z | while read -r -d $'\0' mask type blob path
do
    if [ "$type" != "blob" ]; then continue; fi;
    case "$mask" in
    #do not touch other bits
    100644) chmod a-x "$path";;
    100755) chmod a+x "$path";;
    *) echo "invalid: $mask $type $blob\t$path" >&2; false;;
    esac
done)

एक गैर-उत्पादन-ग्रेड वन-लाइनर (पूरी तरह से मास्क की जगह):

git ls-tree HEAD | perl -ne '/^10(0\d{3}) blob \S+\t(.+)$/ && { system "chmod",$1,$2 || die }'

("$ '\' 0" का श्रेय http://transnum.blogspot.ru/2008/11/bashs-read-built-in-supports-0-as.html पर जाता है )


-2

सबसे आसान काम यह है कि केवल अनुमतियों को वापस बदलना है। जैसा कि @kroger ने नोट किया है केवल निष्पादन योग्य बिट्स को ट्रैक करता है। तो आपको शायद chmod -x filenameइसे ठीक करने के लिए बस चलाने की ज़रूरत है (या +xअगर इसकी ज़रूरत है।


यहाँ से एक उदाहरण है git show: diff - a / OpenWatch / src / org / ale / openwatch / fb / FBUtils.java b / OpenWatch / src / org / ale / openwatch / fb / FBUtils.java index cd6fa6a..e5b0935 100644 । बिट में बोल्ड वहाँ फ़ाइल अनुमति है।
कॉनरेडो

यह मुझे बहुत आसान लगा। दुर्भाग्य से, मैं Conrado रूप में एक ही समस्या का सामना करना - मैं से अनुमति नहीं बदल सके 100644करने के लिए 100755। मुझे नहीं लगता कि आप एक पतन के लायक हैं; Git को नीचे मतदान किया जाना चाहिए। इतने अलग-अलग स्तरों पर इतने सारे तरीकों से यह टूट गया है ...
jww

-2

etckeeperउपकरण अनुमतियाँ और साथ संभाल कर सकते हैं:

etckeeper init -d /mydir

आप अन्य dirs के लिए इसका उपयोग कर सकते हैं /etc

अपने पैकेज मैनेजर का उपयोग करके इंस्टॉल करें या उपरोक्त लिंक से स्रोत प्राप्त करें।


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