git은 내 .sql 파일이 바이너리 파일이라고 생각하는 이유는 무엇입니까?


답변:


98

확장 프로그램만으로는 GitHub가 텍스트 파일인지 확인하기에 충분하지 않습니다.
그래서 그것은 그 내용을 봐야합니다.

그리고 " Git이이 텍스트 파일을 바이너리 파일로 취급하는 이유는 무엇입니까? " 에서 언급했듯이 내용에 텍스트 파일이라고 추측 할만큼 충분한 ASCII 문자가 포함되어 있지 않을 수 있습니다.

.gitattributes 파일 을 사용 .sql하여 바이너리가 아닌 텍스트 여야 함 을 명시 적으로 지정할 수 있습니다.

*.sql diff

업데이트 2018 : " UTF-8 인코딩 문서에서 작동하지 않는 Utf-8 인코딩 "에서 언급 했듯이 Git 2.18 .gitattributes에는 새로운 working-tree-encoding속성이 있습니다.
따라서 Rusi답변 에서 볼 수 있듯이 :

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

으로 kostix는 에 추가 코멘트 :

이러한 파일이 Microsoft SQL Management Studio에서 생성 된 경우 (또는 사용중인 MS SQL Server의 관리 도구 버전에서 호출되는 모든 항목) 저장되는 파일은 UCS-2 (또는 UTF-16)로 인코딩됩니다. Git의 눈에 실제로 텍스트가 아닌 2 바이트 인코딩

"당신은 예를 볼 수 있습니다 힘내라고" Binary files a… and b… differ대한의 " *.reg파일 "

" Set file as non-binary in git " 에서 언급했듯이 :

"Git이 내 파일을 바이너리로 표시하는 이유는 무엇입니까?" 대답은 파일의 처음 8000 자 내에 NUL (0) 바이트가 표시되기 때문입니다.
일반적으로 파일이 UTF-8이 아닌 다른 이름으로 저장되기 때문에 발생합니다. 따라서 UCS-2, UCS-4, UTF-16 또는 UTF-32로 저장 될 수 있습니다. 모두 ASCII 문자를 사용할 때 NUL 문자가 포함되어 있습니다.


Neo 가 주석에서 언급 했듯이 (그리고 Git에서이 텍스트 파일을 바이너리 파일로 취급하는 이유는 무엇입니까? ) :

파일 메뉴의 '고급 저장 옵션'메뉴 항목에서 '서명이있는 UTF-8'인코딩을 선택하여 SSMS에 저장된 파일의 인코딩을 UTF-8로 변경할 수 있습니다.


18
@Alan, 이러한 파일이 Microsoft SQL Management Studio에서 생성 된 경우 (또는 사용중인 MS SQL Server의 관리 도구 버전에서 호출되는 모든 항목) 저장되는 파일은 UCS-2 (또는 UTF-16)로 인코딩됩니다. -Git의 눈에 실제로 텍스트가 아닌 2 바이트 인코딩.
kostix

16
파일 메뉴의 '고급 저장 옵션'메뉴 항목에서 '서명이있는 UTF-8'인코딩을 선택하여 SSMS에 저장된 파일의 인코딩을 UTF-8로 변경할 수 있습니다. 출처 : stackoverflow.com/a/21170043/197591
Neo

2
@Neo 좋은 지적입니다. 더 많은 가시성을 위해 답변에 귀하의 의견을 포함했습니다.
VonC

7
Windows에서 Git Bash를 실행 중이고 파일에 대한 변경 사항을 덮어 쓰지 않으려면 "dos2unix * .sql"을 입력하면됩니다. 그러면 모든 UCS2 파일이 UTF8로 변환되어 git이 텍스트를 인식 할 수 있습니다.
Slothario

1
@thebfactor는 isodos2unix 명령의 ' ' 옵션을 확인하여 도움이되는지 확인합니다 . 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

가져-내용은 파일 이름에 대괄호를 다루는 제 경우에 플래그를 필요로 ([DBO] 등) :$Contents = Get-Content -LiteralPath $MyPath
제레미 머레이

7

오래된 질문에 새로운 답이 있습니다. git은 최근 working-tree-encoding이러한 이유로 옵션 을 확장했습니다. gitattributes 문서 참조 [맨 페이지가 새롭기 때문에 일치하는지 확인하십시오!]

예를 들어 다음을 사용하여 SQL 파일의 인코딩을 찾으십시오. file

Windows 시스템에 bom이없는 utf-16이 있으면 gitattributes 파일에 추가하십시오.

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

utf-16 little endinan (bom 포함)이 만들면

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

1
흥미 롭군. 찬성. 내 답변을 참조했습니다 ( stackoverflow.com/a/28145968/6309 ). 2018 년 5 월 Git 2.18의 새로운 속성을 문서화했습니다. 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 7 64 비트에서 기본 설치에 사용되는 디렉토리입니다.

  • 이 위치에서 빈 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 비트 인코딩 체계 인 코드 페이지 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
그러나 탄탄한 전략은 git이 바이너리로 취급하는 BOM 마커를 제거하지 못했습니다. 대신에, 나는에 대한 답변을 사용 BOM을하지 않고 UTF-8에서 파일을 작성하는 PowerShell을 사용하여 사용[System.IO.File]::WriteAllLines($MyPath, $MyFile, $Utf8NoBomEncoding)
KyleMit
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.