なぜgitは私の.sqlファイルをバイナリファイルと見なすのですか?


84

初めてgithubにプッシュした.sqlファイルがいくつかあります。ただし、コミットを見ると、次のようになっています。

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

「バイナリファイルが表示されていません」と表示されている理由を教えてもらえますか


回答:


98

拡張子だけでは、GitHubがテキストファイルであるかどうかを確認するのに十分ではありません。
そのため、その内容を確認する必要があります。

また、「Gitがこのテキストファイルをバイナリファイルとして扱うのはなぜですか?」で説明したように、そのコンテンツには、テキストファイルであると推測するのに十分なASCII文字が含まれていない可能性があります。

.gitattributesファイルを使用して.sql、バイナリではなくテキストである必要があることを明示的に指定できます。

*.sql diff

2018年の更新:「Utf-8エンコードがutf-8エンコードされたドキュメントで機能しない」で述べたように、Git 2.18.gitattributesに新しいworking-tree-encoding属性があります。
だから、ルシ答えに示されているように:

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

kostixはに追加コメント

これらのファイルがMicrosoftSQL Management Studio(または使用しているMS SQL Serverの管理ツールのバージョンで呼び出されるもの)によって生成された場合、保存されるファイルはUCS-2(またはUTF-16)でエンコードされます。 2バイトエンコーディング。これはGitの目には実際にはテキストではありません。

あなたは「の例を見ることができますGitは言う『Binary files a… and b… differのために』*.regファイル

gitでファイルを非バイナリとして設定する」で述べたように:

「Gitが私のファイルをバイナリとしてマークするのはなぜですか?」答えは、ファイルの最初の8000文字内のどこかにNUL(0)バイトが表示されているためです。
通常、これはファイルがUTF-8以外のものとして保存されているために発生します。したがって、UCS-2、UCS-4、UTF-16、またはUTF-32として保存される可能性があります。ASCII文字を使用する場合、これらすべてにNUL文字が埋め込まれています


ネオは言及コメントで(とで、なぜGitは、バイナリファイルとしてこのテキストファイルを扱うのですか?):

SSMSに保存されたファイルのエンコーディングをUTF-8に変更するには、[ファイル]メニューの[詳細な保存オプション]メニュー項目から[署名付きのUTF-8]を選択します。


18
@Alan、これらのファイルがMicrosoft SQL Management Studio(または使用しているMS SQL Serverの管理ツールのバージョンで呼び出されるもの)によって生成された場合、保存されるファイルはUCS-2(またはUTF-16)でエンコードされます。 --2バイトのエンコーディング。これはGitの目には実際にはテキストではありません。
kostix 2015年

16
SSMSに保存されたファイルのエンコーディングをUTF-8に変更するには、[ファイル]メニューの[詳細な保存オプション]メニュー項目から[署名付きのUTF-8]を選択します。出典:stackoverflow.com/a/21170043/197591
Neo

2
@Neo良い点。わかりやすくするために、回答にコメントを含めました。
vonC 2015年

7
WindowsでGitBashを実行していて、ファイルに加えた変更を上書きしたくない場合のもう1つの巧妙なトリックは、「dos2unix * .sql」と入力することです。これにより、すべてのUCS2ファイルがUTF8に変換され、gitがテキストを認識できるようになります。
Slothario 2017

1
@thebfactorオプション「チェックiso:それは役立ちますかどうかを確認するために、そのコマンドのDOS2UNIXの」をcomputerhope.com/unix/dos2unix.htm
VonC

9

リンクされた質問から受け入れられた回答と他のいくつかのコメントを使用して、Win10で動作し、実行されている問題の解決策としてこれを思いつきました

$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
VonC 2018

ゲット・コンテンツは、ファイル名に角括弧に対処する私の場合にはフラグを必要に応じて([DBO]など):$Contents = Get-Content -LiteralPath $MyPath
ジェレミー・マレー

7

この古い質問には新しい答えがあります—gitは最近オプションを増やしました working-tree-encodingまさにこれらの理由で。gitattributesのドキュメントを参照してください[これはまったく新しいので、manページが一致していることを確認してください!]

SQLファイルのエンコーディングを調べます。 file

(たとえば)Windowsマシンでbomのないutf-16の場合は、gitattributesファイルに追加します

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

utf-16リトルエンディナン(bom付き)の場合は

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

1
面白い。賛成。私は私の答えを参照しました(stackoverflow.com/a/28145968/6309)。:私はGitの2.18のために2018年5月に新たな属性を文書化していた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を見つけます

場所は異なる場合があります。これは、Windows 764ビットのデフォルトインストールで使用されるディレクトリです。

  • この場所で、空のSQLファイルSQLFile.sqlを追加(または編集)します。

これは、新しい.SQLファイルのテンプレートとして使用されます。必要なエンコーディングを使用して保存します(私の場合、Windows行末のあるWindows-1252)。[保存]ボタンの右側にある矢印を使用すると、エンコーディングを選択できます。

gitやSSMSの煩わしさを避けるために、開発チームとエンコーディングを調整する必要があります。


2
SSMS 2012のこのファイルはC:\Program Files (x86)\Microsoft SQL Server\110\Tools\Binn\ManagementStudio\SqlWorkbenchProjectItems\Sql
Aaron D

1
そしてSSMS2016:C:\Program Files (x86)\Microsoft SQL Server\130\Tools\Binn\ManagementStudio\SqlWorkbenchProjectItems\Sql
COXY

4

これは、SSMS 2012を使用して、私がうまくいった簡単な回避策です。ツール=>オプション=>環境=>国際設定で、言語を「英語」から「Microsoft Windowsと同じ」に変更すると(再起動を求められる場合があります)変更を有効にするためのSSMS)、新しいファイルのデフォルトのエンコーディングとしてUTF-16を使用しなくなりました-私が作成するすべての新しいファイルには、8ビットのエンコーディングスキームであるCodepage 1252(ファイル=>高度な保存オプション)がありますと問題がないようです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がバイナリとして扱うものです。代わりに、PowerShell使用して、BOMを使用せずにUTF-8でファイルを書き込むという回答を使用しました[System.IO.File]::WriteAllLines($MyPath, $MyFile, $Utf8NoBomEncoding)
KyleMit 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.