2011-06-29 17 views
6

हमारा bespoke आईडीई एक्सएमएल फाइलों को एक एन्कोडिंग के साथ आउटपुट करता है जो उन्हें बाइनरी फाइलों की तरह दिखता है। इन फ़ाइलों के डिफ और विलय विफल हो जाते हैं।हुक करने के लिए हुक या नहीं - गिट

हम tr कमांड के साथ इन फ़ाइलों के ASCII संस्करण बना सकते हैं। मैं ऐसे राज्य में जाना चाहता हूं जहां ये फाइलें हमेशा प्रतिबद्ध होने से पहले एसीआईआई में परिवर्तित हो जाती हैं।

मैं Git साथ संस्करण नियंत्रण के अपने प्रतिलिपि उठाया और यह पूरे दिल से हुक का उपयोग कर जब तक मैं वास्तव में करने की जरूरत है से दूर मुझे चेतावनी देते हैं।

क्या मुझे इस उद्देश्य के लिए एक हुक का उपयोग करना चाहिए? या मैं यह सुनिश्चित करने के लिए कुछ और कर सकता हूं कि फ़ाइलों को हमेशा प्रतिबद्ध करने से पहले परिवर्तित किया जाता है?

Windows XP msysgit साथ 1.7.4

- = अद्यतन = -

आपकी मदद और धैर्य के लिए

सभी को धन्यवाद। this question करने के लिए देख रहा निम्नलिखित कोशिश की, लेकिन यह काम नहीं करता:

echo "*.xrp filter=xrp" > .git/info/attributes 
git config --global filter.xrp.clean 'tr -cd '\''\11\12\15\40-\176'\''' 
git config --global filter.xrp.smudge cat 
git checkout --force 

फ़ाइलें इस config परिवर्तन के बाद अपरिवर्तित ही रहेंगे। यहां तक ​​कि जब मैं हटाता हूं और फिर से चेकआउट करता हूं।

tr कमांड के रूप में कॉन्फ़िगर किया गया कमांड अलगाव में काम करता है। सबूत:

$ head -n 1 cashflow/repo/C_GMM_CashflowRepo.xrp 
ÿþ< ! - - X M L R e p o s i t o r y f i l e 1 . 0 - - > 

$ tr -cd '\''\11\12\15\40-\176'\' < cashflow/repo/C_GMM_CashflowRepo.xrp | head -n 1 
<!-- XML Repository file 1.0 --> 

क्या कोई मेरी कॉन्फ़िगरेशन में गलत क्या देख सकता है?

+0

असफल कैसे भिन्न होता है या प्रकट होता है? एक विलय किस तरह विफल रहता है? – ralphtheninja

+0

डिफ इसके साथ प्रतिक्रिया करता है: "बाइनरी फाइलें अलग-अलग हैं"। अच्छा सवाल हालांकि, मैं केवल यह मान रहा हूं कि विलय भिन्न होने में असमर्थ होने के परिणामस्वरूप विफल हो जाएगा। भले ही, diff की क्षमता होने के लिए अच्छा होगा। – Synesso

उत्तर

5

हुक के साथ एक मुद्दा यह है कि उन्हें वितरित नहीं किया जाता है।

.gitattributes यदि अंतर और एक फाइल की सामग्री का प्रबंधन करने के लिए कुछ निर्देश है, लेकिन एक और विकल्प होगा एक attribute filter (अभी भी .gitattributes में), और स्वचालित रूप से प्रतिबद्ध पर उन फ़ाइलों को परिवर्तित कर सकते हैं।
(यह है, तो साफ स्क्रिप्ट detect those files based on their content alone करने में सक्षम है)


प्रति इस चैट चर्चा, ओपी Synesso एक सफलता रिपोर्ट:

.gitattributes: 
*.xrp filter=xrp 

~/.gitconfig: 
[filter "xrp"] 
clean = \"C:/Program Files/Git/bin/tr.exe\" -cd "\\''\\11\\12\\15\\40-\\176'\\'" 
smudge = cat 

तब मैं फ़ाइल को संशोधित करने के लिए किया था, जोड़ें, प्रतिबद्ध करें, हटाएं, चेकआउट ... और फिर यह तय किया गया था। :)

ध्यान दें कि, किसी भी संशोधन के जो सिर्फ एक उपयोगकर्ता चिंता का विषय नहीं है, लेकिन संभावित किसी भी उपयोगकर्ता क्लोनिंग कि रेपो, मैं, जोड़ने पसंद करते हैं (और करने से) एक अतिरिक्त .gitattributes फ़ाइल जिसमें फिल्टर घोषित किया जाता है न कि करता है के लिए .git/info/attribute फ़ाइल को संशोधित करने से (जिसे चारों ओर क्लोन नहीं किया गया है)।

gitattributes man page से:

  • आप केवल एक ही भंडार (यानी, फ़ाइलों को इस संग्रह के लिए एक उपयोगकर्ता के कार्यप्रवाह करने के लिए विशेष रूप से कर रहे हैं के लिए गुण आवंटित करने के लिए) को प्रभावित करना चाहते हैं, तो विशेषताओं रखा जाना चाहिए $GIT_DIR/info/attributes फ़ाइल में।
  • गुण जो संस्करण-नियंत्रित और अन्य भंडारों (यानी, सभी उपयोगकर्ताओं के लिए ब्याज की विशेषता) को वितरित किया जाना चाहिए .gitattributes फ़ाइलों में जाना चाहिए।
  • गुण जो एक ही उपयोगकर्ता के लिए सभी भंडारों को प्रभावित करना चाहिए core.attributesfile कॉन्फ़िगरेशन विकल्प द्वारा निर्दिष्ट फ़ाइल में रखा जाना चाहिए।
  • सिस्टम पर सभी उपयोगकर्ताओं के लिए गुण $ (उपसर्ग)/etc/gitattributes फ़ाइल में रखा जाना चाहिए।

http://git-scm.com/docs/gitattributes


phyattin the comments जोड़ता है:

मैं एक उदाहरण sqlite3 के लिए इस के समान बना दिया।
आप सही फाइलों में जोड़ सकते हैं दो पंक्तियों के साथ:

git config diff.sqlite3.textconv 'sqlite3 $1 .dump' 
echo '*.db diff=sqlite3' >> $(git rev-parse --show-toplevel)/.gitattributes 

इसी तर्ज अन्य Git config पथ लिखने के लिए इस्तेमाल किया जा सकता।

+0

धन्यवाद। विशेषता फ़िल्टर समान रूप से दिलचस्प के रूप में ध्वनि। – Synesso

+0

मुझे विशेषता फ़िल्टर सबसे उपयोगी पाया गया। अंत में मुझे यह प्रश्न मिला: http://stackoverflow.com/questions/2316677/can-git-automatically-switch-between-spaces-and-tabs/2318063#2318063 - मैंने समाधान का प्रयास किया लेकिन यह काम नहीं करता है। प्रश्न अपडेट किया गया। – Synesso

+0

@ साइनेसो: क्या आपने फिर से सभी भंडारों को फिर से चेकआउट करने का प्रयास किया था? – VonC

2

क्या diff उनके पर काम करने का मौका खड़ा है (यानी वे केवल अजीब बाइट्स के मुट्ठी भर हैं लेकिन अन्यथा पाठ हैं) या नहीं? यदि ऐसा होता है, तो आप .gitattributes के साथ टेक्स्ट के रूप में उनका इलाज करने के लिए गिट को मजबूर कर सकते हैं। यदि नहीं, तो यह कस्टम डिफ बनाने और स्क्रिप्ट मर्ज करने के लिए बेहतर हो सकता है (जो कन्वर्ट करने के लिए आवश्यक tr का उपयोग करेगा) और गिट को इसका उपयोग करने के लिए कहें, फिर से .gitattributes के साथ।

किसी भी मामले में आप हुक (जो विशेष परिचालनों में चलने के लिए हैं) का उपयोग नहीं करेंगे, लेकिन .gitattributes, जो फ़ाइल-विशिष्ट हैं।

+0

फाइलें एक्सएमएल हैं, लेकिन जब मैं उन्हें हेक्सडम्प में देखता हूं तो प्रत्येक बाइट 00 के साथ छेड़छाड़ की जाती है। नतीजतन उन्हें diff द्वारा बाइनरी के रूप में माना जाता है। आपका समाधान बहुत आसान लगता है। मैं कल इसे आजमाउंगा। – Synesso

2

यदि आपका पसंदीदा संपादन प्रारूप ASCII था और केवल आपके निर्माण के लिए बाइनरी फाइलों की आवश्यकता होती है तो मैं पसंदीदा स्रोत से बाइनरी संस्करण उत्पन्न करने के लिए बिल्ड नियमों का उपयोग करने की अनुशंसा करता हूं जो आप भंडार में करेंगे।

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

बल्कि हुक से, विशेष रूप से diff और textconv जो आपको कुछ निश्चित पैटर्न मिलान diffing के वैकल्पिक साधनों का उपयोग करने के लिए फ़ाइलों को कॉन्फ़िगर करने की अनुमति git help attributes को देखो। आप फ़ाइलों को संग्रहीत करने या उन्हें संपादित करने के साथ समझौता किए बिना काम करने वाले ASCII diffs का उत्पादन करने में सक्षम होना चाहिए।

संपादित करें: आपकी टिप्पणी के आधार पर कहीं और "हर दूसरे बाइट 0 है" जो सुझाव देता है कि फ़ाइल यूटीएफ -16 या यूसीएस -2 है। diff के लिए यह उत्तर देखें जो यूनिकोड को संभाल सकता है: Can I make git recognize a UTF-16 file as text?

+0

धन्यवाद। मुझे यह स्पष्ट करना चाहिए था कि आईडीई एक फलकेक है और फाइलें बाइनरी के रूप में लिखती हैं जब वे वास्तव में नहीं होते हैं। बाइनरी होने के लिए बिल्कुल कोई फायदा नहीं है। आपके सहायक उत्तर के लिए धन्यवाद! एक्सएमएल फाइलों को ऑन-डिमांड बनाने के लिए – Synesso

+0

+1 और केवल स्रोत दस्तावेज़ (एस) को करने के लिए जो एक्सएमएल उत्पन्न होता है। –

+0

@Synesso आपकी टिप्पणी के आधार पर मैंने एक संबंधित प्रश्न का एक लिंक जोड़ा। –

संबंधित मुद्दे