[git] 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를 확인했는데 비어 있습니다. 이 메시지가 나타나는 이유는 무엇입니까? 더 이상 사용할 때 diffs를 얻을 수 없습니다

추가 :

@파일 권한 이 있음을 알았습니다 . 이것이 이유가 될 수 있습니까?

$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이 파일의 실제 내용을 검사 할 때 주어진 확장자가 이진 파일 이 아니라는 것을 알지 못합니다 -속성 파일을 명시 적으로 말하고 싶다면 매뉴얼 페이지를 참조하십시오.

파일의 내용을 검사 한 결과 기본 ASCII 문자가 아닌 것을 발견했습니다. UTF16이기 때문에 ‘재미있는’문자를 가질 것으로 예상되므로 바이너리라고 생각합니다.

파일에 국제화 (i18n) 또는 확장 문자 형식이있는 경우 git에 알리는 방법이 있습니다. 나는 그것을 설정하는 정확한 방법에 충분히 익숙하지 않다-RT [Full] M ;-)해야 할 수도있다

편집 : SO에 대한 빠른 검색을 통해 can-i-make-git-recognize-a-utf-16-file-as-text 를 찾을 수 있습니다.


답변

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

저장소 루트 폴더에 .gitattributes 를 추가 하고 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 파일을 바이너리로 취급하여 차이를 볼 수없는이 문제가 발생했습니다.

다음 내용으로 .git \ info 폴더에 “attributes”라는 파일을 생성하면 문제가 해결되었습니다.

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

모든 저장소에 대해이 변경을 수행하려는 경우 $ HOME / .config / git / attributes 위치에 속성 파일을 추가 할 수 있습니다.


답변

Git은 텍스트 파일에 하나의 긴 줄이 있으면 바이너리인지 확인합니다. 나는 긴 문자열을 끊어 여러 소스 코드 줄로 바꾸었고 갑자기 파일이 ‘이진’에서 (SmartGit에서 볼 수있는) 텍스트 파일로 바뀌 었습니다.

따라서 편집기에서 ‘Enter’를 누르지 않고 오른쪽으로 너무 멀리 입력하지 마십시오. 그렇지 않으면 나중에 Git에서 바이너리 파일을 생성했다고 생각합니다.


답변

새 편집기에서 파일 중 하나를 편집 한 후에도 동일한 문제가 발생했습니다. 새 편집기에서 기존 편집기 (UTF-8)와 다른 인코딩 (유니 코드)을 사용했습니다. 따라서 새 편집기에서 UTF-8로 파일을 저장하도록 지시 한 다음 git에서 변경 사항을 다시 올바르게 표시하고 이진 파일로 보지 않았습니다.

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

테스트하지는 않았지만 새 유니 코드 인코딩으로 파일을 커밋 한 경우 다음에 해당 파일을 변경하면 변경 사항이 올바르게 표시되고 바이너리로 감지되지 않았을 것입니다. 그런 다음 UTF-8 파일이 아닌 두 개의 유니 코드 인코딩 파일을 유니 코드 파일과 비교했을 것입니다.

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


답변

나는 같은 문제가 있었다. Google에서 솔루션을 검색 할 때 스레드를 찾았지만 여전히 실마리를 찾지 못했습니다. 그러나 나는 공부 후 이유를 발견했다고 생각합니다. 아래 예는 내 단서를 명확하게 설명합니다.

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

현재는 new.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 파일을 변경하려고 할 때마다 .html 파일이 이진으로 표시되는 경우가있었습니다. diff를 보지 않으면 매우 불편합니다. 솔직히 말해서, 여기에있는 모든 솔루션을 확인하지는 않았지만 우리에게 도움이 된 것은 다음과 같습니다.

  1. 파일을 제거하고 (실제로 내 데스크탑으로 옮겼습니다) git deletion. 힘내 말한다Deleted file with mode 100644 (Regular) Binary file differs
  2. 파일을 다시 추가했습니다 (실제로 내 데스크탑에서 프로젝트로 파일을 옮겼습니다). 힘내 말한다 New file with mode 100644 (Regular) 1 chunk, 135 insertions, 0 deletions파일이 이제 일반 텍스트 파일로 추가되었습니다

이제부터 파일에서 변경 한 내용은 일반 텍스트 차이로 표시됩니다. 이 커밋을 스쿼시 할 수도 있습니다 (1, 2 및 3은 실제 변경 사항입니다).하지만 나중에 내가 한 일을 볼 수 있기를 바랍니다. 스 쿼싱 1과 2는 이진 변화를 보여줍니다.