2010-09-16 7 views
7

संभव डुप्लिकेट में द्विआधारी के रूप में पहचान के साथ:
Why does Mercurial think my SQL files are binary?फ़ाइलें .sql विस्तार मर्क्युरियल

मैं एक डेटाबेस में संग्रहित प्रक्रियाओं के लिए स्क्रिप्ट का एक पूरा सेट उत्पन्न। जब मैंने एक Mercurial भंडार बनाया और इन फ़ाइलों को जोड़ा वे सभी बाइनरी के रूप में जोड़ा गया था। जाहिर है, मुझे अभी भी संस्करण के लाभ मिलते हैं, लेकिन टेक्स्ट फाइलों की बहुत सारी दक्षता, 'diff'ing, आदि ... खो देते हैं। मैंने सत्यापित किया कि ये फ़ाइलें वास्तव में सभी पाठ हैं।

ऐसा क्यों कर रहा है?

इससे बचने के लिए मैं क्या कर सकता हूं?

क्या एचजी को इन फ़ाइलों के बारे में दिमाग बदलने के लिए कोई तरीका है?

496.1 Binary file SQL/SfiData/Stored Procedures/dbo.pFindCustomerByMatchCode.StoredProcedure.sql has changed 
    497.1 Binary file SQL/SfiData/Stored Procedures/dbo.pFindUnreconcilableChecks.StoredProcedure.sql has changed 
    498.1 Binary file SQL/SfiData/Stored Procedures/dbo.pFixBadLabelSelected.StoredProcedure.sql has changed 
    499.1 Binary file SQL/SfiData/Stored Procedures/dbo.pFixCCOPL.StoredProcedure.sql has changed 
    500.1 Binary file SQL/SfiData/Stored Procedures/dbo.pFixCCOrderMoneyError.StoredProcedure.sql has changed 

आपकी मदद के लिए अग्रिम धन्यवाद जिम

+2

एचजी निर्णय लेता है कि एक फ़ाइल बाइनरी है यदि इसमें एनयूएल बाइट है, तो क्या यह मामला है? – tonfa

+1

कौन सा अक्षरसेट इन .sql फ़ाइलों का उपयोग करता है? कुछ वर्णमाला (जैसे utf16 और utf32) को बाइनरी के रूप में पहचाना जाता है। – Rudi

उत्तर

8

मर्क्युरियल के views on binary files साथ फिटिंग में, यह वास्तव में फ़ाइल प्रकारों को ट्रैक नहीं करता है, जिसका अर्थ है कि वहाँ:

यहाँ changeset लॉग का एक टुकड़ा है किसी उपयोगकर्ता को फ़ाइल को बाइनरी या बाइनरी के रूप में चिह्नित करने का कोई तरीका नहीं है।

जैसा कि टोनफा और रूडी ने उल्लेख किया है, Mercurial निर्धारित करता है कि फ़ाइल बाइनरी है या नहीं, यह देखकर कि फ़ाइल में कहीं भी एक एनयूएल बाइट है या नहीं। यूटीएफ- [16 | 32] फाइलों के मामले में, एक एनयूएल बाइट काफी गारंटीकृत है।

इसे "ठीक करने" के लिए, आपको यह सुनिश्चित करना होगा कि फ़ाइलों को यूटीएफ -16 के बजाय यूटीएफ -8 के साथ एन्कोड किया गया हो। आदर्श रूप से, आपके डेटाबेस में निर्यात करते समय यूनिकोड एन्कोडिंग की सेटिंग होगी। यदि ऐसा नहीं है, तो एक और विकल्प यह करने के लिए प्रीकॉमिट हुक लिखना होगा (शुरुआत के लिए How to convert a file to UTF-8 in Python देखें), लेकिन आपको बहुत सावधान रहना होगा कि आप कौन सी फाइलों को परिवर्तित कर रहे थे।

+1

tghw का सही उत्तर है, यह स्पष्ट रूप से इंगित करने योग्य है कि "बाइनरी" और "टेक्स्ट" फ़ाइलों को आंतरिक रूप से आंतरिक रूप से संभाला जाता है। वे केवल विलय टूल (जो आसानी से कॉन्फ़िगर किया गया है) में भिन्न होते हैं और उपयोगकर्ताओं को अलग-अलग/आने वाली/आउटगोइंग पर दिखाता है। वास्तविक भंडारण और विलय समान है। –

+1

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

+0

आपकी सहायता के लिए सभी को धन्यवाद। –

7

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

सौभाग्य से आप एक माइक्रोसॉफ्ट टेक्नोलॉजी (पावरहेल) का उपयोग किसी अन्य माइक्रोसॉफ्ट टेक्नोलॉजी (एसएसएमएस) के साथ किसी समस्या को दूर करने के लिए कर सकते हैं - पावरहेल का उपयोग करके, अपनी * .sql फ़ाइलों वाली निर्देशिका में बदलें और फिर कॉपी और पेस्ट करें Powershell खोल में निम्नलिखित (या एक .ps1 स्क्रिप्ट के रूप में बचाने के लिए और Powershell से चलाने - कमांड को चलाने के लिए सुनिश्चित करें कि "सेट ExecutionPolicy RemoteSigned" एक .ps1 स्क्रिप्ट चलाने के लिए प्रयास करने से पहले):


function Get-FileEncoding 
{ 
    [CmdletBinding()] Param (
    [Parameter(Mandatory = $True, ValueFromPipelineByPropertyName = $True)] [string]$Path 
) 

    [byte[]]$byte = get-content -Encoding byte -ReadCount 4 -TotalCount 4 -Path $Path 

    if ($byte[0] -eq 0xef -and $byte[1] -eq 0xbb -and $byte[2] -eq 0xbf) 
    { Write-Output 'UTF8' } 
    elseif ($byte[0] -eq 0xfe -and $byte[1] -eq 0xff) 
    { Write-Output 'Unicode' } 
    elseif ($byte[0] -eq 0xff -and $byte[1] -eq 0xfe) 
    { Write-Output 'Unicode' } 
    elseif ($byte[0] -eq 0 -and $byte[1] -eq 0 -and $byte[2] -eq 0xfe -and $byte[3] -eq 0xff) 
    { Write-Output 'UTF32' } 
    elseif ($byte[0] -eq 0x2b -and $byte[1] -eq 0x2f -and $byte[2] -eq 0x76) 
    { Write-Output 'UTF7'} 
    else 
    { Write-Output 'ASCII' } 
} 


$files = get-ChildItem "*.sql" 
foreach ($file in $files) 
{ 
$encoding = Get-FileEncoding $file 
If ($encoding -eq 'Unicode') 
    { 
    (Get-Content "$file" -Encoding Unicode) | Set-Content -Encoding UTF8 "$file" 
    } 
} 

फ़ंक्शन Get-FileEncodingकी सौजन्य हैहालांकि मुझे इसे यूसी 2 छोटी एंडियन फाइलों को पूरा करने के लिए थोड़ा सा संशोधित करना पड़ा, जिसे एसएसएमएस ने इन्हें सहेजा है। मैं आपकी फ़ाइलों को पहले बैक अप लेने की अनुशंसा करता हूं क्योंकि यह मूल को ओवरराइट करता है - आप निश्चित रूप से स्क्रिप्ट को संशोधित कर सकते हैं ताकि यह फ़ाइल के यूटीएफ -8 संस्करण को सहेज सके।कोड की अंतिम पंक्ति को बदलने के लिए:

(Get-Content "$file" -Encoding Unicode) | Set-Content -Encoding UTF8 "$file.new" 

स्क्रिप्ट उप-निर्देशिकाओं को भी संशोधित करना आसान होना चाहिए।

अब जब आप कोई नया * .sql फ़ाइलें हैं, तो आप इसे बदलने और अपने परिवर्तनों को धक्का देने से पहले इसे चलाने के लिए याद रखना होगा। एसएसएमएस में पहले से ही परिवर्तित और बाद में खोला गया कोई भी फाइल सहेजे जाने पर यूटीएफ -8 के रूप में रहेगी।

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