Git मेरे .sql फ़ाइल को बाइनरी फ़ाइल क्यों मानता है?


84

मेरे पास कुछ .sql फाइलें हैं जिन्हें मैंने पहली बार गिथब में धकेला है। हालाँकि जब मैं यह कह रहा हूँ तो यह देखिए:

BIN  WebRole/Sql/Database.sql View
Binary file not shown

क्या कोई मुझे बता सकता है कि यह क्यों कह रहा है "बाइनरी फ़ाइल नहीं दिखाई गई"


जवाबों:


98

यह देखने के लिए कि क्या यह एक पाठ फ़ाइल है, अकेले एक्सटेंशन GitHub के लिए पर्याप्त नहीं है।
इसलिए इसकी सामग्री को देखना होगा।

और जैसा कि " Git इस पाठ फ़ाइल को बाइनरी फ़ाइल के रूप में क्यों मानता है?" "

आप स्पष्ट रूप से एक पाठ होना चाहिए निर्दिष्ट करने के लिए एक .gitattributes फ़ाइल का उपयोग कर सकते हैं .sql, बाइनरी नहीं।

*.sql diff

अपडेट २०१ Update: जैसा कि मैंने " यूटीएफ -8 एनकोडिंग डॉक्यूमेंट पर काम नहीं करने के लिए यूटीएफ -8 एन्कोडिंग डॉक्यूमेंट " में उल्लेख किया है, २.१ribut working-tree-encoding.सुविधाएँ एक नई विशेषता है।
तो, जैसा कि रुसी के जवाब में दिखाया गया है :

*.sql text working-tree-encoding=UTF-16LE eol=CRLF

जैसा कि कोस्टिक्स टिप्पणियों में जोड़ता है :

यदि ये फ़ाइलें Microsoft SQL प्रबंधन स्टूडियो (या जो भी इसे MS SQL सर्वर के प्रबंधन उपकरण आपके द्वारा उपयोग किए जा रहे संस्करण में कहा जाता है) द्वारा उत्पन्न की जाती हैं, तो इसे सहेजने वाली फाइलें UCS-2 (या UTF-16) में एन्कोडेड होती हैं - a दो-बाइट एन्कोडिंग, जो वास्तव में गिट की आंखों में पाठ नहीं है

आप फ़ाइलों के लिए " गिट कहते हैं" में एक उदाहरण देख सकते हैंBinary files a… and b… differ*.reg "

जैसा कि " सेट फ़ाइल को गैर-बाइनरी में git में सेट करें ":

"Git मेरी फाइल को बाइनरी के रूप में क्यों चिह्नित कर रहा है?" इसका उत्तर यह है क्योंकि यह NUL (0) बाइट को फाइल के पहले 8000 अक्षरों के भीतर कहीं देख रहा है।
आमतौर पर, ऐसा इसलिए होता है क्योंकि फ़ाइल को UTF-8 के अलावा किसी अन्य चीज़ के रूप में सहेजा जा रहा है। इसलिए, यह संभवत: UCS-2, UCS-4, UTF-16, या UTF-32 के रूप में सहेजा जा रहा है। उन सभी ने ASCII वर्णों का उपयोग करते समय NUL वर्णों को एम्बेड किया है


जैसा कि नियो ने टिप्पणियों में उल्लेख किया है (और Git इस पाठ फ़ाइल को बाइनरी फ़ाइल के रूप में क्यों मानता है? )

आप फ़ाइल मेनू में 'उन्नत सहेजें विकल्प' मेनू आइटम से 'UTF-8 हस्ताक्षर के साथ' का चयन करके SSMS से UTF-8 में सहेजे गए फ़ाइल के एन्कोडिंग को बदल सकते हैं।


18
@Alan, यदि ये फ़ाइलें Microsoft SQL प्रबंधन स्टूडियो (या जो भी इसे MS SQL सर्वर के प्रबंधन उपकरण आपके द्वारा उपयोग किए जा रहे संस्करण में कहा जाता है) द्वारा जनरेट किया जाता है, तो इसे सहेजने वाली फाइलें UCS-2 (या UTF-16) में एन्कोडेड होती हैं - एक दो-बाइट एन्कोडिंग, जो वास्तव में गिट की आंखों में पाठ नहीं है।
कोस्टिक्स

16
आप फ़ाइल मेनू में 'उन्नत सहेजें विकल्प' मेनू आइटम से 'UTF-8 हस्ताक्षर के साथ' का चयन करके SSMS से UTF-8 में सहेजे गए फ़ाइल के एन्कोडिंग को बदल सकते हैं। स्रोत: stackoverflow.com/a/21170043/197591
Neo

2
@ अच्छा बिंदु। अधिक दृश्यता के उत्तर में मैंने आपकी टिप्पणी को शामिल किया है।
VonC

7
एक और साफ-सुथरी चाल, यदि आप विंडोज में गिट बैश चला रहे हैं और आप फाइल में किए गए किसी भी बदलाव को ओवरराइट नहीं करना चाहते हैं, तो बस "dos2unix * .sql" टाइप कर रहे हैं। यह यूसीएस 2 की सभी फाइलों को यूटीएफ 8 में बदल देगा, जिससे टेक्स्ट को पहचानने में मदद मिलेगी।
स्लॉथैरियो

1
@thebfactor यह देखने के लिए isoकि कमांड dos2unix का विकल्प ' ' जांचता है कि क्या मदद करता है: computerhope.com/unix/dos2unix.htm
VonC

9

लिंक किए गए प्रश्न और कुछ अन्य टिप्पणियों से स्वीकृत उत्तर का उपयोग करके मैं इस मुद्दे के समाधान के रूप में आया, जो काम कर रहा है और 1010 पर काम कर रहा है

$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding $False
Get-ChildItem -Recurse *.sql | foreach {
    $MyPath = $_.FullName;
    $Contents = Get-Content $MyPath
    [System.IO.File]::WriteAllLines($MyPath, $Contents, $Utf8NoBomEncoding)
}

1
दिलचस्प है। Powershell का उपयोग करते हुए, मैं देखता हूं। +1
वॉनसी

गेट-कंटेंट को फ़ाइल नामों (जैसे [dbo]) में वर्ग कोष्ठक से निपटने के लिए मेरे मामले में एक ध्वज की आवश्यकता थी:$Contents = Get-Content -LiteralPath $MyPath
जेरेमी मरे

7

Ths के पुराने प्रश्न का नया उत्तर है - git ने हाल ही में working-tree-encodingइन कारणों के लिए एक विकल्प ठीक से विकसित किया है। Gitattributes देखें डॉक्स [सुनिश्चित करें कि आपका मैन पेज मैच है क्योंकि यह काफी नया है!]

जैसे के साथ sql फ़ाइल के एन्कोडिंग का पता लगाएं file

अगर (कहना) विंडोज़ मशीन पर बम के बिना इसका utf-16 है तो अपनी gitattributes फ़ाइल में जोड़ें

*.sql text working-tree-encoding=UTF-16LE eol=CRLF

अगर utf-16 थोड़ा एंडिनन (बम के साथ) बनाते हैं

*.sql text working-tree-encoding=UTF-16 eol=CRLF

1
दिलचस्प है। Upvoted। मैंने आपके उत्तर का उल्लेख मेरा ( stackoverflow.com/a/28145968/6309 ) पर किया है। मैंने Git 2.18 के लिए मई 2018 में नई विशेषता का दस्तावेजीकरण किया था: stackoverflow.com/a/50435869/6309
VonC

4

2008 R2 (हाँ, अभी भी!) के लिए SSMS में इस समस्या से जूझने वालों के लिए, आप डिफ़ॉल्ट एन्कोडिंग को निम्नानुसार सेट कर सकते हैं:

  • निर्देशिका C: \ Program Files (x86) \ Microsoft SQL Server \ 100 \ Tools \ Binn \ VSShell \ Common7 \ IDE \ SqlWorkbenchProjectItems \ Sql का पता लगाएँ

स्थान भिन्न हो सकते हैं। यह विंडोज 7 64-बिट पर डिफ़ॉल्ट स्थापना द्वारा उपयोग की जाने वाली निर्देशिका है।

  • इस स्थान पर, SQL फ़ाइल SQLFile.sql जोड़ें (या संपादित करें)।

यह नई .SQL फ़ाइलों के लिए एक टेम्पलेट के रूप में उपयोग किया जाता है। आपके द्वारा आवश्यक एन्कोडिंग का उपयोग करके इसे सहेजें (मेरे मामले में, विंडोज लाइन के साथ विंडोज 1252)। 'सेव' बटन के दाईं ओर का तीर आपको एनकोडिंग का विकल्प देता है।

जीआईटी और एसएसएमएस परेशानी से बचने के लिए आपको अपनी विकास टीम के साथ सांकेतिक तालमेल करने की आवश्यकता है।


2
मुझे SSMS 2012 के लिए यह फाइल मिलीC:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\SqlWorkbenchProjectItems\Sql
हारून डी

1
और SSMS2016:C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\ManagementStudio\SqlWorkbenchProjectItems\Sql
Coxy

4

यहाँ एक त्वरित वर्कअराउंड है जो SSMS 2012 का उपयोग करके मेरे लिए काम करता है। टूल्स => विकल्प => पर्यावरण => अंतर्राष्ट्रीय सेटिंग्स के तहत, यदि आप "अंग्रेजी" से "समान रूप से माइक्रोसॉफ्ट विंडोज" में भाषा बदलते हैं (यह आपको पुनः आरंभ करने के लिए प्रेरित कर सकता है। प्रभावी होने के लिए SSMS), यह अब नई फ़ाइलों के लिए डिफ़ॉल्ट एन्कोडिंग के रूप में UTF-16 का उपयोग नहीं करेगा- मेरे द्वारा बनाई गई सभी नई फ़ाइलों में कोडपेज 1252 (फ़ाइल => उन्नत बचत विकल्प) अब है, जो एक 8 बिट एन्कोडिंग योजना है और लगता है कि कोई समस्या नहीं हैGit Diff


1

इस समस्या को हल करने का तरीका फ़ाइल को 8-बिट एन्कोडिंग का उपयोग करने के लिए मजबूर करना है। आप इस PowerShell स्क्रिप्ट को वर्तमान निर्देशिका और इसकी उपनिर्देशिकाओं में सभी .SQL फ़ाइलों के एन्कोडिंग को बदलने के लिए चला सकते हैं।

Get-ChildItem -Recurse *.sql | foreach {
  $FileName = $_.FullName;
  [System.Io.File]::ReadAllText($FileName) | Out-File -FilePath $FileName -Encoding UTF8;
}

2
एक ठोस रणनीति, हालांकि, इसने मेरे लिए BOM मार्कर को नहीं हटाया, जो कि git को बाइनरी के रूप में मानता है। इसके बजाय, मैंने बिना BOM जो यूटीएफ -8 में एक फ़ाइल लिखने के लिए[System.IO.File]::WriteAllLines($MyPath, $MyFile, $Utf8NoBomEncoding)
पावरशेल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.