programing

Git가 UTF-16 파일을 텍스트로 인식하도록 할 수 있습니까?

bestprogram 2023. 8. 30. 21:55

Git가 UTF-16 파일을 텍스트로 인식하도록 할 수 있습니까?

가상 PC 가상 시스템 파일(*.vmc)을 추적하는 중인데, Git을 변경한 후 파일이 이진 파일로 식별되어 문제가 발생하지 않았습니다.저는 그 파일이 UTF-16으로 인코딩된 것을 발견했습니다.

이 파일이 텍스트임을 인식하고 적절하게 처리하도록 가르칠 수 있습니까?

Cygwin 밑에 있는 Git을 코어로 사용하고 있습니다.autocolf가 false로 설정되었습니다.필요하다면 UNIX에서 mSysGit orgit을 사용할 수 있습니다.

저는 한동안 이 문제와 씨름하다가 (저에게) 완벽한 해결책을 발견했습니다.

$ git config --global diff.tool vimdiff      # or merge.tool to get merging too!
$ git difftool commit1 commit2

git difftool는 " 동한인사용니다합수를와일다"와 동일한 합니다.git diff하지만 내장된 GNU 대신 당신이 선택한 다른 프로그램을 실행합니다.diff멀티바이트 인식 차이를 선택합니다(제 경우).vim에서) diff 모드를 합니다.git difftoolgit diff.

"diff tool"이 너무 길어서 입력할 수 없습니까?문제 없음:

$ git config --global alias.dt difftool
$ git dt commit1 commit2

기트락.

Unices에서 바로 사용할 수 있는 매우 간단한 솔루션이 있습니다.

를 들어,에서는 Apple의 제의우가 됩니다..strings파일만:

  1. 성을 합니다..gitattributes저장소 루트에 다음을 포함하는 파일:

     *.strings diff=localizablestrings
    
  2. 다을추다니에 합니다.~/.gitconfig파일 이름:

     [diff "localizablestrings"]
     textconv = "iconv -f utf-16 -t utf-8"
    

출처: Git의 Diff.strings 파일( 2010년 이전 게시물).

은 당신의 설정해 보았습니까?.gitattributes텍스트 파일로 처리할 수 있습니까?

예:

*.vmc diff

자세한 내용은 http://www.git-scm.com/docs/gitattributes.html 을 참조하십시오.

기본적으로 다음과 같이 표시됩니다.git UTF-16 파일이 없는지 . 이러한 파일의 경우에는 안 됩니다.CRLF처리는 그것에 대해 완료되었지만, 당신은 원합니다.diff그리고.merge일반 텍스트 파일로 작동합니다(단말기/편집기가 UTF-16을 처리할 수 있는지 여부를 무시합니다).

하지만 manpage를 보면, 여기 사용자 지정 속성이 있습니다.binary:

[attr]binary -diff -crlf

인 따서최수준서사지수정있에서 사용자 지정 속성을 할 수 합니다..gitattributes위해서utf16(텍스트로 처리되도록 여기에 병합을 추가합니다.)

[attr]utf16 diff merge -crlf

으로 할 수 ..gitattributes다음과 같은 파일:

*.vmc utf16

또한 파일을 저장할 수 있어야 합니다.git다음을 포함하는 이진수라고 생각합니다.

git diff --text

편집

이 대답은 기본적으로 UTF-16 또는 UTF-8을 사용하는 GNU diff가 잘 작동하지 않는다고 말합니다.갖고 싶다면,git합니다(「 」 「 」 「 」 「 」를 통해).--ext-diff), 그 대답은 Guiffy를 암시합니다.

하지만 당신에게 필요한 것은 단지diffASCII 문자만 포함된 UTF-16 파일입니다.그것을 작동시키는 방법은 사용하는 것입니다.--ext-diff셸 스크립트를 사용합니다.

#!/bin/bash
diff <(iconv -f utf-16 -t utf-8 "$1") <(iconv -f utf-16 -t utf-8 "$2")

UTF-8로 변환하면 병합에도 효과가 있을 수 있으므로 양방향으로 수행해야 합니다.

UTF-16 파일의 diff를 볼 때 단말기로 출력되는 경우:

그렇게 디프하려고 하면 바이너리 가비지가 화면에 뿜어져요.git가 GNU diff를 사용하고 있다면, GNU diff는 유니코드를 인식하지 않는 것처럼 보일 것입니다.

GNU diff는 유니코드에 별로 관심이 없기 때문에 diff --text를 사용하면 텍스트가 분산되어 출력됩니다.문제는 사용 중인 단말기가 방출되는 UTF-16(ASCII 문자인 디프마크와 결합)을 처리할 수 없다는 것입니다.

git는 최근 utf16과 같은 인코딩을 이해하기 시작했습니다.Git 특성 문서 참조, 검색working-tree-encoding

[이것은 꽤 새롭기 때문에 당신의 남자 페이지가 일치하는지 확인하세요!]

인 경우 UTF-16) Windows에 합니다..gitattributes

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

*nix에서 UTF-16(bom 포함)이 작동하는 경우:

*.vmc text working-tree-encoding=UTF-16-BOM eol=LF

(바꾸기)*.vmc와 함께*.whatever위해서whatever처리해야 하는 파일을 입력합니다.

참조: 작업 트리 인코딩 "UTF-16LE-BOM"을 지원합니다.


나중에 추가됨

@Hackslash에 이어 이것이 불충분하다는 것을 발견할 수 있습니다.

 *.vmc text working-tree... 

필요한 텍스트 디프를 얻으려면

 *.vmc diff working-tree...

두 가지 작업을 모두 넣는 도 마찬가지입니다.

 *.vmc text diff working-tree... 

하지만 거의 틀림없이.

  • — 중복 -eol=...함축성이 있는text
  • 상세 - 대규모 프로젝트는 수십 가지의 텍스트 파일 형식을 쉽게 가질 수 있습니다.

문제

Git에 매크로 속성이 있습니다. binary은 즉, 즉을 합니다.-text -diff+text +diff git는 그것을 하기 위한기 제 기 제 는 만 없 도 위 를 제 합 공 니 구 다 는 에 생 각 기 한 하 합 성 을 그 것 공 능 은 지 제 ) ▁is ▁( ▁the it ) i 본 ▁g ▁gives ! ▁for 에 ▁( -는 ! 생 각 니 다 합 공

해결책

Git를 사용하면 새 매크로 속성을 정의할 수 있습니다.

저는 그것을 제안하고 싶습니다..gitattributes가지고 계신 파일

 [attr]textfile text diff

그러면 텍스트와 diffdo가 필요한 모든 경로에 대해

 path textfile working-tree-encoding= eol=...

대부분의 경우 기본 인코딩(utf-8)과 기본 eol(네이티브)을 원하므로 삭제할 수 있습니다.

대부분의 선은 다음과 같아야 합니다.

*.c textfile
*.py textfile
Etc

왜 그냥 diff를 사용하지 않습니까?

의 경우 대부분의 경우 우리는 토종 장어를 원합니다.은 '아니오'라는 뜻입니다.eol=....그렇게text암시되지 않으므로 명시적으로 입력해야 합니다.

개념:텍스트와 이진수는 기본적인 구별입니다.eol, 인코딩, diff 등은 그것의 일부 측면일 뿐입니다.

부인

우리가 살고 있는 이상한 시대 때문에 저는 현재 작동하는 장비를 가진 기계를 가지고 있지 않습니다.그래서 저는 현재 최신 추가 사항을 확인할 수 없습니다.누군가 잘못된 것을 발견하면 수정/제거합니다.

은 솔션은필통것다입니과는하를 통해 입니다.cmd.exe /c "type %1"cmd의type내장된 변환 기능이 변환을 수행하므로 Gitdiff의 텍스트 편의성을 사용하여 UTF-16 파일의 텍스트 디핑을 활성화할 수 있습니다(테스트되지는 않았지만 UTF-8에서도 작동해야 함).

git 속성 man 페이지에서 인용:


이진 파일의 텍스트 차이 수행

경우에 따라 일부 이진 파일의 텍스트 변환 버전의 차이를 확인하는 것이 바람직합니다.예를 들어 워드 프로세서 문서를 ASCII 텍스트 표현으로 변환할 수 있으며 표시된 텍스트의 디프를 표시할 수 있습니다.이 변환으로 일부 정보가 손실되더라도 결과적인 차이는 사람이 보는 데 유용합니다(직접 적용할 수 없음).

textconv 구성 옵션은 이러한 변환을 수행하기 위한 프로그램을 정의하는 데 사용됩니다.프로그램은 변환할 파일의 이름인 단일 인수를 사용하고 stdout에 결과 텍스트를 생성해야 합니다.

) 을 사용자의 " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " 을 추가합니다.$GIT_DIR/config 파또일 (는▁file$HOME/.gitconfig으):

[diff "jpg"]
        textconv = exif

w32, cygwin 팬을 형성하는 솔루션은 접근 방식을 변경해야 할 수 있습니다.이 문제는 cmd.exe로 변환할 파일 이름을 전달하는 데 발생합니다. 파일 이름은 순방향 슬래시를 사용하며 cmd는 백슬래시 디렉토리 구분자를 가정합니다.

1단계:

stdout으로 변환할 단일 인수 스크립트를 만듭니다.c:\path\to\some\script.sh:

#!/bin/bash
SED='s/\//\\\\\\\\/g'
FILE=\`echo $1 | sed -e "$SED"\`
cmd.exe /c "type $FILE"

2단계:

스크립트 파일을 사용할 수 있도록 git을 설정합니다.구성 (Git 성내부구(부)~/.gitconfig또는.git/config또는 보다man git-config), 다음과 같이 입력합니다.

[diff "cmdtype"]
textconv = c:/path/to/some/script.sh

3단계:

.git 특성 파일을 활용하여 이 작업을 적용할 파일을 가리킵니다(mangit 특성(5) 참조).

*vmc diff=cmdtype

그 다음에 사용git diff파일에 있습니다.

나는 작은 Git-diff 드라이버를 썼습니다.to-utf8따라서 ASCII가 아닌/UTF-8 인코딩된 파일을 쉽게 구별할 수 있습니다.https://github.com/chaitanyagupta/gitutils#to-utf8 의 지침에 따라 설치할 수 있습니다.to-utf8스크립트는 동일한 레포에서 사용할 수 있습니다.

에는 이립트는두모필다니요합두가가지에스크▁both다니▁requires▁note가 모두 필요합니다.file그리고.iconv시스템에서 사용할 수 있는 명령입니다.

이가 발생한 , 에서 사용하지 않습니다.dos2unix그리고.unix2dos창문을 위한 깃이 달린 상자들이 속임수를 썼습니다.기적으위는에 합니다.C:\Program Files\Git\usr\bin\파일UTF-16일 필요 없는 경우에만 작동합니다.예를 들어, 누군가 실수로 파이썬 파일을 UTF-16으로 인코딩했습니다(내 경우).

PS C:\Users\xxx> dos2unix my_file.py
dos2unix: converting UTF-16LE file my_file.py to ANSI_X3.4-1968 Unix format...

그리고.

PS C:\Users\xxx> unix2dos my_file.py
unix2dos: converting UTF-16LE file my_file.py to ANSI_X3.4-1968 DOS format...

다른 답변에서 설명한 것처럼 gitdiff는 UTF-16 파일을 텍스트로 처리하지 않으므로 예를 들어 Atlassian 소스 트리에서 볼 수 없습니다.파일 이름/또는 접미사를 알고 있는 경우 아래 수정을 통해 해당 파일을 소스 트리에서 일반적으로 볼 수 있고 비교할 수 있습니다.

UTF-16 파일의 파일 접미사가 알려진 경우(*.uni 등) 해당 접미사가 있는 모든 파일을 UTF-16-8 변환기와 연결할 수 있으며 다음 두 가지 변경 사항이 있습니다.

  1. 다음 행을 사용하여 저장소의 루트 디렉터리에 .git 특성 파일을 생성하거나 수정합니다.

     *.uni diff=utf16
    
  2. 그런 다음 다음 섹션을 사용하여 사용자 홈 디렉토리(C:\Users\yourusername\.gitconfig)의 .gitconfig 파일을 수정합니다.

    [diff=utf16]
        textconv = "iconv -f utf-16 -t utf-8"
    

이러한 두 가지 변경 사항은 리포지토리를 소스 트리에 다시 로드하지 않고 즉시 적용됩니다.모든 *.uni 파일에 텍스트 변환을 적용하여 다른 텍스트 파일과 마찬가지로 볼 수 있고 비교할 수 있습니다.다른 파일에서 이 변환이 필요한 경우 .git 속성 파일에 줄을 추가할 수 있습니다. (지정된 파일이 UTF-16이 아닌 경우 해당 파일에 대한 읽을 수 없는 결과가 표시됩니다.)

이 답변은 Tony Kuneck의 답변을 단순하게 다시 쓴 것입니다.

git 속성에 대한 git 문서는 인코딩 주제에 대해 간단하고 좋은 설명을 제공합니다.

Git는 ASCII 또는 해당 슈퍼셋 중 하나(예: UTF-8, ISO-8859-1 등)로 인코딩된 파일을 텍스트 파일로 인식합니다.특정 다른 인코딩(예: UTF-16)으로 인코딩된 파일은 이진으로 해석되고 결과적으로 내장된 Git 텍스트 처리 도구(예: Gitdiff)로 해석되며 대부분의 Git 웹 프런트 엔드는 이러한 파일의 내용을 기본적으로 시각화하지 않습니다.

하만지그, 그.working-tree-encodingattribute를 사용하면 저장소에 저장하기 전에 어떤 파일을 다시 인코딩해야 하는지(UTF-8로) Git에게 알려줄 수 있습니다.나중에 작업 디렉토리에 "복사"되면 원래 인코딩으로 "복사"됩니다.

고지 사항 - (아마도) 여기에 있는 모든 것이 다른 답변에서 언급되었고, 일부는 문제를 해결하는 방법에 대해 훨씬 더 자세히 설명했습니다.하지만, 제가 포함한 인용문은 몇 시간 동안 찾아본 후에 "Git가 UTF-8 이외의 인코딩을 처리할 수 있을까?"라는 대답이 얼마나 간단한지 깨닫게 했습니다.

언급URL : https://stackoverflow.com/questions/777949/can-i-make-git-recognize-a-utf-16-file-as-text