क्या गिट्टियां अपने आप रिक्त स्थान और टैब के बीच बदल सकती हैं?


196

मैं अपने पाइथन कार्यक्रमों में इंडेंटेशन के लिए टैब का उपयोग करता हूं, लेकिन मैं उन लोगों के साथ सहयोग करना चाहूंगा (जो कि जगह का उपयोग करते हैं)।

क्या धक्का देने और लाने पर स्वचालित रूप से रिक्त स्थान और टैब (जैसे, 4 रिक्त स्थान = 1 टैब) के बीच परिवर्तित करने का एक तरीका है? (सीआर / एलएफ रूपांतरण के समान)


33
PEP8 ठीक मेरी समस्या है। हर कोई इसका अनुसरण करता है और मैं अपने टैब के साथ फंस गया हूं। मुझे लगता है कि एक इंडेंटेशन = एक टैब सही काम करने के लिए होता है (रिक्त स्थान क्यों? 4 स्थान क्यों? PEP8 यह नहीं समझाते ...)। वैसे भी, इस चाल के साथ, मैं खुशी से अपने कंप्यूटर पर टैब का उपयोग कर सकता हूं और अपने कोड को सभी PEP8 अनुयायियों के साथ साझा कर सकता हूं।
ओलिवियर वर्डियर

7
ओह! मैं TextMate का उपयोग करता हूं, और मैं रिक्त स्थान से टैब के बीच परिवर्तित कर सकता हूं। बात यह है कि, जब मैंने टैब मारा, तो मुझे लिखना पसंद है ... टैब। इसलिए अगर मैं रिक्त स्थान के साथ एक अजगर परियोजना की जांच करता हूं, तो मैं सभी प्रकार के टैब डालूंगा। मुझे मैन्युअल रूप से टैब में रूपांतरित होना चाहिए, लेकिन जब मैं जांच करता हूं, तो यह 1000 हटाए जाने, 1000 परिवर्धन की तरह दिखता है, और मेरे सहयोगी खुश नहीं होंगे। :-)
ओलिवियर वर्डियर

6
PEP8 टैब के बजाय रिक्त स्थान निर्दिष्ट करता है क्योंकि निरंतर इंडेंटेशन नियमों के कारण है। एक पैतृक के अंदर एक लंबी-लंबी लाइन को जारी रखने के दो तरीके हैं। यदि आप एक पैतृक के तुरंत बाद एक नई लाइन शुरू करते हैं तो आप सिर्फ एक इंडेंट करते हैं। यदि आप इसके बजाय पहली पंक्ति पर पेरेंटेटिकल की सामग्री का हिस्सा रखते हैं, तो आपको ओपनिंग पेरेंटाइल के इंडेंटेशन स्तर पर अगली पंक्ति के पेरेंटाइल को जारी रखना होगा। यदि आप ऐसे टैब का उपयोग करते हैं जो काम नहीं करते हैं।
जॉन क्रिस्टोफर जोन्स

2
उस स्थिति के लिए @JohnChristopherJones, व्यक्ति पिछली पंक्ति के साथ इंडेंटेशन मिलान करने के लिए टैब का उपयोग कर सकता है, फिर पिछली पंक्ति में स्थिति से मिलान करने के लिए रिक्त स्थान। इसे आसानी से रिक्त स्थान में परिवर्तित किया जा सकता है। दुर्भाग्य से रिवर्स सच नहीं है, क्योंकि यह संरेखण जानकारी के साथ इंडेंटेशन की जानकारी देता है।
पैट्रिक पार्कर

जवाबों:


196

यहाँ पूरा समाधान है:

अपनी रिपॉजिटरी में, एक फ़ाइल जोड़ें .git/info/attributesजिसमें शामिल हैं:

*.py  filter=tabspace

लिनक्स / यूनिक्स

अब कमांड चलाएं:

git config --global filter.tabspace.smudge 'unexpand --tabs=4 --first-only'
git config --global filter.tabspace.clean 'expand --tabs=4 --initial'

ओएस एक्स

पहले काढ़ा के साथ coreutils स्थापित करें:

brew install coreutils

अब कमांड चलाएं:

git config --global filter.tabspace.smudge 'gunexpand --tabs=4 --first-only'
git config --global filter.tabspace.clean 'gexpand --tabs=4 --initial'

सभी सिस्टम

अब आप अपने प्रोजेक्ट की सभी फाइलों को देख सकते हैं। आप ऐसा कर सकते हैं:

git checkout HEAD -- **

और सभी अजगर फाइलों में अब रिक्त स्थान के बजाय टैब होंगे।

संपादित करें : मजबूर चेकआउट कमांड को बदल दिया। आपको अपना काम पहले करना चाहिए, निश्चित रूप से।


1
स्वच्छ फिल्टर मेरे लिए काम नहीं कर रहा है। जब मैं git add करता हूँ। मुझे यह कहते हुए एक त्रुटि हुई "त्रुटि: बाहरी फिल्टर का विस्तार --tabs = 4 --initial विफल"। मैं विंडोज पर हूँ। क्या इससे कुछ अन्तर पड़ता है?
जेरेमी हिक्स

2
@ जेरेमी: एक्सपैंड / अनएक्सपैंड यूनिक्स कमांड हैं। आपको या तो विंडोज पोर्ट / समतुल्य खोजना होगा या सिग्विन
टिम

1
मैंने पाया है कि वर्किंग वर्जन sourceforge.net/projects/gnuwin32/files/coreutils/5.3.0
hazzik

3
@ मार्क-आंद्रे अच्छा बिंदु। मैं वास्तव में Coreutils संस्करणों का उपयोग करता हूं। (स्थापित करें homebrew, और फिर चलाएं brew install coreutils)।
ओलिवियर वर्डियर

2
ऐसा लगता है कि यह अब काम नहीं करता है, फिल्टर मेरे लिए कुछ भी नहीं करते हैं। चेकआउट के बाद, फ़ाइलों में अभी भी रिक्त स्थान हैं। इस पर किसी भी अद्यतन?
फिलिप लुडविग

141

हाँ, एक संभावित समाधान एक गिट विशेषता फिल्टर ड्राइवर (यह भी GitPro पुस्तक देखें ) का उपयोग करने के लिए, एक धब्बा / स्वच्छ तंत्र को परिभाषित करने के लिए है।

वैकल्पिक शब्द

उस तरफ:

  • हर बार जब आप अपने रेपो की कुछ फ़ाइलों की जांच करते हैं, तो स्थानों को टैब में परिवर्तित किया जा सकता है,
  • लेकिन जब आप चेक-इन (और पुश और प्रकाशित) करते हैं, तो उन्हीं फ़ाइलों को केवल रिक्त स्थान का उपयोग करके संग्रहीत किया जाता है।

आप निम्न सामग्री के साथ, इस फ़िल्टर ड्राइवर ( Git रेपो के भीतर सभी फ़ाइलों पर लागू किए गए फ़िल्टर के लिए tabspace) को यहाँ घोषित कर सकते हैं .git/info/attributes:

*.py  filter=tabspace

अब कमांड चलाएं:

# local config for the current repo
git config filter.tabspace.smudge 'script_to_make_tabs'
git config filter.tabspace.clean 'script_to_make_spaces'

निर्देशों के ऐसे स्मूदी / साफ सेट के ठोस काम करने के उदाहरण के लिए ओलिवियर का उत्तर देखें ।


दुर्भाग्य से, यह सिर्फ काम नहीं करता है। मैंने सभी निर्देशों का पालन किया, लेकिन गिट फिटर को लागू नहीं करता है। :-( जब मैं चेकआउट करता हूं, तो स्मज फिल्टर नहीं लगाया जाता है, और जब मैं चेक करता हूं, तो या तो कुछ भी नहीं होता है ... गिट कभी-कभी इतना निराशाजनक होता है ...
ओलिवियर वर्डियर

@Olivier: अजीब बात है, मुझे कभी भी इससे कोई समस्या नहीं हुई, जब तक कि मैं चेकआउट / चेक को धीमा न करने के लिए विशेषता फ़िल्टर (केवल एक विशिष्ट प्रकार की फ़ाइलों के लिए,) के दायरे को ध्यान से सीमित करता हूं। इस प्रक्रिया में। उदाहरण के लिए देखें stackoverflow.com/questions/62264/…
VonC

धन्यवाद! अब यह काम कर रहा है। पूरा समाधान देखें: stackoverflow.com/questions/2316677/…
ओलिवियर वर्डियर

@Vonc: शायद किसी को --globalध्वज को हटा देना चाहिए , क्योंकि इसका मतलब यह होगा कि आप हर सहयोग परियोजना को रिक्त स्थान भेजते हैं ...
विल्म वान ओन्सेम

@CommuSoft केवल उन परियोजनाओं के लिए जिनके पास अधिकार है .gitattributes। लेकिन हां, यह समझना आसान है कि क्या कॉन्फ़िगरेशन को रेपो के लिए स्थानीय रखा गया है। मैंने उत्तर संपादित किया है।
VonC

39

GitHub (या अन्य समान सेवा) का उपयोग करने वाले सभी के लिए बहुत उपयोगी जानकारी

~/.gitconfig

[filter "tabspace"]
    smudge = unexpand --tabs=4 --first-only
    clean = expand --tabs=4 --initial
[filter "tabspace2"]
    smudge = unexpand --tabs=2 --first-only
    clean = expand --tabs=2 --initial

फिर मेरे पास दो फाइलें हैं: attributes

*.js  filter=tabspace
*.html  filter=tabspace
*.css  filter=tabspace
*.json  filter=tabspace

तथा attributes2

*.js  filter=tabspace2
*.html  filter=tabspace2
*.css  filter=tabspace2
*.json  filter=tabspace2

व्यक्तिगत परियोजनाओं पर काम करना

mkdir project
cd project
git init
cp ~/path/to/attributes .git/info/

इस तरह, जब आप अंततः अपने काम को गितुब पर धक्का देते हैं, तो यह कोड दृश्य में मूर्खतापूर्ण नहीं लगेगा 8 space tabsजिसके साथ सभी ब्राउज़रों में डिफ़ॉल्ट व्यवहार होता है।

अन्य परियोजनाओं में योगदान

mkdir project
cd project
git init
cp ~/path/to/attributes2 .git/info/attributes
git remote add origin git@github.com:some/repo.git
git pull origin branch

इस तरह आप 2 space indentedपरियोजनाओं पर सामान्य टैब के साथ काम कर सकते हैं।

निश्चित रूप से आप इसी तरह के समाधान के लिए लिख सकते हैं 4 space to 2 spaceजिसमें से अगर आप मेरे द्वारा प्रकाशित परियोजनाओं में योगदान करना चाहते हैं और आप विकास करते समय 2 स्थानों का उपयोग करते हैं।


2
संबंधित: भंडार के भाग के रूप में भंडारण विन्यास जमा करना ; यह भी ध्यान दें कि आप .gitattributesअपने रेपो में एक फाइल (और कमिट) का उपयोग कर सकते हैं
टोबियास किंजलर

1

यदि आप खिड़कियों पर हैं तो आपके पास काम करने के लिए @Olivier Verdier का समाधान पाने के लिए कुछ अतिरिक्त कदम हैं।

  1. विंडोज़ के लिए CoreUtils डाउनलोड करें
  2. अपने PATH में इंस्टॉल लोकेशन डालने के बाद ( पाथ वेरिएबल कैसे जोड़ें )
  3. मैंने विस्तार का नाम बदलकर g.exeand.exe कर दिया है क्योंकि पहले से ही एक विंडोज़ का विस्तार उपयोगिता है।
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.