2010-06-30 9 views
11

क्या गिट या svn के लिए प्रीकॉमिट हुक बनाना संभव है जो किसी विशिष्ट एन्कोडिंग में किए गए फ़ाइलों को अस्वीकार कर सकता है?गैर-यूटीएफ -8 फ़ाइल एन्कोडिंग को रोकता है जो पूर्व-प्रतिबद्ध हुक बनाने के लिए कैसे करें

मैं कई परियोजना पर काम किया है, जहां यह (UTF-8 उदाहरण के लिए) की तरह एक निश्चित फ़ाइल इनकोडिंग से चिपक

उत्तर

7

आपका iconv अगर कुछ UTF-8 नहीं है, लेकिन अन्य एन्कोडिंग इतना आसान नहीं हो सकता है आपको बताने के लिए सक्षम हो सकता है (विशेष रूप से 8-बिट, एकल बाइट एन्कोडिंग जैसे आईएसओ -885 9 -1)।

गिट के लिए, आप वास्तव में प्री-प्रतिबद्ध हुक के बजाय एक अपडेट हुक चाहते हैं (ताकि नियम को लागू करने के लिए इसे केंद्रीय भंडार में चलाया जा सके)।

Git पूर्व प्रतिबद्ध हुक:

#!/bin/sh 
git ls-files -z -- | 
xargs -0 sh -c ' 

    e="" 
    for f; do 
     if ! git show :"$f" | 
      iconv -f UTF-8 -t UTF-8 >/dev/null 2>&1; then 
      e=1 
      echo "Not UTF-8: $f" 
      #exit 255 # to abort after first non-UTF-8 file 
     fi 
    done 
    test -z "$e" 

' - 

Git ls-फाइलों पर -- कमांड लाइन के बाद एक या अधिक Git pathspecs रखो pathnames कि जाँच कर रहे हैं सीमित करने के लिए।

एक अद्यतन हुक में अद्यतन रेफरी की नोक जाँच करने के लिए, git ls-tree --name-only -r -z $3 -- | का उपयोग pathnames (उत्पन्न करने के लिए ध्यान दें: यह कैसा Git ls-फ़ाइलें पैटर्न pathspecs संभाल नहीं करता, इसलिए खोल में किसी भी पैटर्न आधारित छानने करना कोड) और git show "$3:$f" फ़ाइल सामग्री निकालने के लिए। आप न केवल टिप प्रतिबद्धता की जांच कर सकते हैं, बल्कि प्रत्येक नई प्रतिबद्धता (के बजाय git rev-list ^$2 $3 में प्रत्येक प्रतिबद्धता के लिए लूप)।

4

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

आप सामान्य वर्ण सीमा के बाहर वर्णों के लिए फ़ाइल खोज सकते हैं। यदि फ़ाइल के लिए एन्कोडिंग बताने के लिए कोई जादू संख्या या टैग है, तो आप उसे देख सकते हैं। अन्यथा खुद से पूछें "मुझे यह कैसे पता चलेगा कि यह फ़ाइल गलत एन्कोडिंग में है?" क्या आप इसे कोड कर सकते हैं?

2

आप यूटीएफ -8 से एन्कोडिंग को बदलने के लिए iconv उपयोगिता का उपयोग कर सकते हैं उदाहरण के लिए यूटीएफ -16। और अगर परिवर्तन विफल रहता है, स्रोत फ़ाइल सही एन्कोडिंग में नहीं है:

$ iconv -f UTF-8 -t UTF-16 Strings.java 
ÿþ 
testing = iconv: illegal input sequence at position 11 
संबंधित मुद्दे