programing

Git는 왜 이 텍스트 파일을 이진 파일로 취급합니까?

topblog 2023. 7. 22. 09:08
반응형

Git는 왜 이 텍스트 파일을 이진 파일로 취급합니까?

git이 왜 나에게 이런 말을 하는지 궁금합니다.

$ git diff MyFile.txt
diff --git a/MyFile.txt b/MyFile.txt
index d41a4f3..15dcfa2 100644
Binary files a/MyFile.txt and b/MyFile.txt differ

문자 파일 아닌가요?

는 확했습다인니▁ 확인했습니다..gitattributes그리고 그것은 비어 있습니다.하지 않습니다. ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜㅜ 이전과 같이 더 이상 문제가 발생할 수 없습니다.

추가됨:

제가알것은린차아것▁an▁is▁there은▁i▁noticed'가 있다는 것을 알아챘습니다.@파일 권한에서, 이것은 무엇입니까? 이것이 이유입니까?

$ls -all
drwxr-xr-x   5 nacho4d  staff    170 28 Jul 17:07 .
drwxr-xr-x  16 nacho4d  staff    544 28 Jul 16:39 ..
-rw-r--r--@  1 nacho4d  staff   6148 28 Jul 16:15 .DS_Store
-rw-r--r--@  1 nacho4d  staff    746 28 Jul 17:07 MyFile.txt
-rw-r--r--   1 nacho4d  staff  22538  5 Apr 16:18 OtherFile.txt

이것은 단순히 git가 파일의 실제 내용을 검사할 때 (특정 확장자가 이진 파일이 아니라는 것을 알지 못함 - 명시적으로 말하고 싶다면 속성 파일을 사용할 수 있음 - man 페이지 참조)를 의미합니다.

파일 내용을 검사한 결과 기본 ASCII 문자가 아닌 항목이 발견되었습니다.UTF16이기 때문에 저는 그것이 이진법이라고 생각하기 때문에 '재미있는' 문자를 가지고 있을 것으로 예상합니다.

파일에 대한 국제화(i18n) 또는 확장 문자 형식이 있는지 여부를 git에 알려주는 방법이 있습니다.나는 그것을 설정하는 정확한 방법에 대해 충분히 알지 못합니다 - 당신은 RT[Full]M;-)가 필요할 수도 있습니다.

편집: 몇 가지 단서를 제공하는 텍스트로 can-i-make-git-recognize-a-utf-16 파일을 찾을 수 있는 SO의 빠른 검색.

파일 형식을 설정하지 않은 경우 Git는 자동으로 파일을 확인하려고 시도하며 줄이 길고 일부 문자(예: 유니코드)가 넓은 파일은 이진으로 처리됩니다..git 속성 파일을 사용하여 Git이 파일을 해석하는 방법을 정의할 수 있습니다.diff 속성을 수동으로 설정하면 Git는 파일 내용을 텍스트로 해석할 수 있으며 일반적인 diff를 수행합니다.

.git 특성을 저장소 루트 폴더에 추가하고 경로 또는 파일에 diff 특성을 설정하기만 하면 됩니다.다음은 예입니다.

src/Acme/DemoBundle/Resources/public/js/i18n/* diff
doc/Help/NothingToSay.yml                      diff
*.css                                          diff

파일에 설정된 속성이 있는지 확인하려면 git check-attr의 도움을 받아 확인할 수 있습니다.

git check-attr --all -- src/my_file.txt

Git 속성에 대한 또 다른 좋은 참조는 여기에서 찾을 수 있습니다.

Git GUI와 SourceTree가 Java/JS 파일을 이진 파일로 처리하여 문제가 발생하지 않았습니다.

는 이름의 파일 attributes.git/info다음 내용으로 문제를 해결했습니다.

*.java diff
*.js diff
*.pl diff
*.txt diff
*.ts diff
*.html diff
*.sh diff
*.xml diff

모든 할 수 .attributes$HOME/.config/git/attributes.

Git는 텍스트 파일에 초장행이 하나 있으면 이진수임을 확인할 수도 있습니다.저는 긴 String을 여러 개의 소스 코드 줄로 나누었고, 갑자기 파일이 '2진수'에서 (SmartGit에서) 볼 수 있는 텍스트 파일로 바뀌었습니다.

따라서 편집기에서 'Enter'를 누르지 않고 오른쪽으로 너무 멀리 입력하지 마십시오. 그렇지 않으면 나중에 Git에서 이진 파일을 만들었다고 생각할 수 있습니다.

새 편집기에서 제 파일 중 하나를 편집한 후에도 같은 문제가 발생했습니다.새 편집기가 이전 편집기(UTF-8)와 다른 인코딩(유니코드)을 사용한 것으로 나타났습니다.그래서 저는 단순히 제 새 편집자에게 UTF-8로 제 파일을 저장하라고 말한 다음 Git이 제 변경 사항을 다시 제대로 보여주고 바이너리 파일로 보지 않았습니다.

제 생각에 문제는 단순히 git이 다른 인코딩 유형의 파일을 비교하는 방법을 모른다는 것이었습니다.따라서 사용하는 인코딩 유형은 일관성을 유지하는 한 중요하지 않습니다.

테스트하지는 않았지만 파일을 새 유니코드 인코딩으로 커밋했다면 다음 번에 파일을 변경했을 때 UTF-8 파일이 아닌 두 개의 유니코드 인코딩 파일을 유니코드 파일과 비교했을 때 바이너리로 인식되지 않고 변경 내용이 제대로 표시되었을 것입니다.

메모장++같은 앱을 사용하여 텍스트 파일의 인코딩 유형을 쉽게 보고 변경할 수 있습니다. 메모장++에서 파일을 열고 도구 모음의 인코딩 메뉴를 사용합니다.

이 문제는 적어도 Windows에서 BOM 인코딩이 포함된 UTF-8이 있는 텍스트 파일에 의해서도 발생합니다.인코딩을 일반 UTF-8로 변경하면 Git는 즉시 파일을 type=text로 볼 수 있습니다.

저도 같은 문제를 겪었습니다.제가 구글에서 솔루션을 검색할 때 스레드를 찾았는데, 여전히 아무런 단서를 찾지 못합니다.하지만 공부를 한 후에 그 이유를 찾은 것 같아요, 아래 예시는 저의 단서를 명확하게 설명해 줄 것입니다.

    echo "new text" > new.txt
    git add new.txt
    git commit -m "dummy"

일단 파일은 새것입니다.txt는 텍스트 파일로 간주됩니다.

    echo -e "newer text\000" > new.txt
    git diff

당신은 이 결과를 얻을 것입니다.

diff --git a/new.txt b/new.txt
index fa49b07..410428c 100644
Binary files a/new.txt and b/new.txt differ

그리고 이것을 먹어보세요.

git diff -a

당신은 아래로 내려갈 것입니다.

    diff --git a/new.txt b/new.txt
    index fa49b07..9664e3f 100644
    --- a/new.txt
    +++ b/new.txt
    @@ -1 +1 @@
    -new file
    +newer text^@

변경을 시도할 때마다 .html 파일이 이진 파일로 표시되는 경우가 있었습니다.차이를 보지 않는 것은 매우 멋지지 않습니다.솔직히 말해서, 저는 여기에 있는 모든 솔루션을 확인하지는 않았지만, 우리에게 효과가 있었던 것은 다음과 같습니다.

  1. 내),git deletion says 겟이즈세.Deleted file with mode 100644 (Regular) Binary file differs
  2. 파일을 다시 추가했습니다(실제로 데스크톱에서 프로젝트로 다시 이동). says 겟이즈세.New file with mode 100644 (Regular) 1 chunk, 135 insertions, 0 deletions되었습니다.

이제부터 파일에서 변경한 내용은 일반 텍스트 차이로 표시됩니다.이러한 커밋을 제거할 수도 있지만(1, 2, 3이 실제 변경 사항임) 나중에 제가 한 일을 볼 수 있기를 원합니다.1과 2를 스퀴즈하면 이진 변경 사항이 표시됩니다.

파일을 사용하여 인코딩 세부 정보(참조)를 봅니다.

cd directory/of/interest
file *

다음과 같은 유용한 출력을 생성합니다.

$ file *
CR6Series_stats resaved.dat: ASCII text, with very long lines, with CRLF line terminators
CR6Series_stats utf8.dat:    UTF-8 Unicode (with BOM) text, with very long lines, with CRLF line terminators
CR6Series_stats.dat:         ASCII text, with very long lines, with CRLF line terminators
readme.md:                   ASCII text, with CRLF line terminators

나는 한 예를 들었다..gitignore더블을 포함했습니다.\r(반복) 목적별 시퀀스.

해당 파일은 git에 의해 바이너리로 식별되었습니다.추가.gitattributes파일 도움말

# .gitattributes file
.gitignore diff

한다면git check-attr --all -- src/my_file.txt파일이 이진으로 플래그 지정되어 있으며 에서 이진으로 설정하지 않았음을 나타냅니다..gitattributes에서 확인합니다./.git/info/attributes.

Aux.js를 Sig.js와 같은 다른 이름으로 변경합니다.

원본 트리에는 여전히 이진 파일로 표시되지만 준비(추가)하고 커밋할 수 있습니다.

바이너리 카프카 메시지의 텍스트를 붙여넣었을 때도 비슷한 문제가 있었습니다. 바이너리 카프카 메시지는 보이지 않는 문자를 삽입하여 git가 파일이 바이너리라고 생각하게 했습니다.

regex를 사용하여 파일을 검색하여 문제가 되는 문자를 찾았습니다.[^ -~\n\r\t]+.

  • [이 집합의 문자 일치
  • ^이 집합에 없는 문자와 일치
  • -~' '(공백)에서 '~'까지의 모든 문자와 일치합니다.
  • \n신라인
  • \r운임 반환
  • \t
  • ]밀집된 집합
  • +다음 문자 중 하나 이상과 일치합니다.

Powershell 터미널에서 echo 명령을 사용하여 디파짓 중인 파일이 생성되었을 때 동일한 메시지를 받았습니다.

echo "new file" > newfile.txt

편집기로 파일을 열고 편집한 후에도 바이너리 파일로 남아 있습니다.

저에게 가장 빠르고 더러운 해결책은 파일의 내용을 복사하여 삭제하고 편집기에서 직접 다시 만들고(터미널에서가 아님) 내용을 다시 붙여넣는 것이었습니다.이후 디파잉은 예상했던 대로 정확한 라인별 충돌을 보여주었습니다.

솔루션의 테스트 프로젝트 중 하나가 탐색기에 테스트를 추가하지 않은 이유를 알아내려고 몇 시간 동안 이 목록의 모든 내용을 검토했습니다.

제 경우에는 VS가 프로젝트에 대한 참조를 완전히 상실한 것으로 나타났습니다(아마도 어딘가에서 Git Merge가 제대로 이루어지지 않았기 때문일 것입니다.)그것은 여전히 건설 중이었지만 저는 그것이 의존성만을 건설했다는 것을 알아차렸습니다.

종속성 목록 자체에 표시되지 않는다는 것을 알고 테스트 프로젝트를 제거했다가 다시 추가했습니다. 모든 테스트가 마침내 표시되었습니다.

파일이 바이너리로 표시되는 이유(그리고 나는 전혀 문제가 되지 않았습니다.git diff또는 SourceTree)는 문제의 파일이 Git LFS 파일로 추가되었기 때문입니다.

Git(및 SourceTree)는 LFS에 추가된 텍스트 파일을 디파짓할 수 없는 것 같습니다.하지만 사냥을 좀 한 후에 저는 이것을 달음으로써 고칠 수 있었습니다.git config --global diff.lfs.textconv cat

여기 제안의 도움으로...https://github.com/git-lfs/git-lfs/issues/440#issuecomment-501007460

할 때 에서 이 했습니다.echoPowershell에서 텍스트 파일을 만들 수 있습니다.용사를 합니다.echo 연산자와 >텍스트 데이터를 쓰기/쓰기하면 유니코드 인코딩을 가진 파일이 생성됩니다.

PS> echo 'sample' > data.txt
PS> Get-Encoding data.txt

Encoding                    Path
--------                    ----
System.Text.UnicodeEncoding data.txt
PS> git diff --staged

diff --git a/data.txt b/data.txt
...
Binary files /dev/null and b/data.txt differ

한 가지 해결책은 인코딩을 ASCII로 변환하는 것입니다. (Convert-FileEncoding을 사용하여 여러 파일의 인코딩을 동시에 변경할 수도 있습니다.)

PS> Set-Content data.txt $(Get-Content data.txt) -Encoding ascii

이렇게 하면 Git는 더 이상 텍스트 파일을 이진 파일로 취급하지 않습니다.

PS> git add -A; git diff --staged


diff --git a/data.txt b/data.txt
...
--- /dev/null
+++ b/data.txt
@@ -0,0 +1 @@
+sample

이 문제를 방지하려면 우선 Powershell을 사용해야 합니다.Set-Content그리고.Add-Content텍스트 파일을 만들거나 추가하는 명령:

PS> Set-Content data2.txt 'sample2'
PS> git add -A; git diff --staged data2.txt


diff --git a/data2.txt b/data2.txt
...
--- /dev/null
+++ b/data2.txt
@@ -0,0 +1 @@
+sample2

언급URL : https://stackoverflow.com/questions/6855712/why-does-git-treat-this-text-file-as-a-binary-file

반응형