programing

Windows의 Git Shell: 패치의 기본 문자 인코딩은 UCS-2 리틀 엔디안입니다. BOM 없이 ANSI 또는 UTF-8로 변경하는 방법은 무엇입니까?

css3 2023. 8. 8. 21:44

Windows의 Git Shell: 패치의 기본 문자 인코딩은 UCS-2 리틀 엔디안입니다. BOM 없이 ANSI 또는 UTF-8로 변경하는 방법은 무엇입니까?

Windows에서 Git Shell로 디프 패치를 생성하는 경우(Windows용 GitHub 사용 시), Notepad++에 따라 패치의 문자 인코딩은 UCS-2 Little Endian이 됩니다(아래 스크린샷 참조).

이 동작을 변경하고 BOM 문자 인코딩 없이 ANSI 또는 UTF-8로 패치를 생성하도록 git을 강제하는 방법은 무엇입니까?

UCS-2 Little Endian 인코딩 패치를 적용할 수 없기 때문에 문제가 발생합니다. 수동으로 ANSI로 변환해야 합니다.그렇지 않으면 "fatal: 인식할 수 없는 입력" 오류가 발생합니다.

Creating git patch

Notepad++ screenshot of the character encoding


로 저는 윈도우 Windows 포맷)에서.\r\n ( ) UNIX ( )\n Notepad> > 를 메모장++(편집 > EOL 변환 > UNIX)에 표시합니다.그렇지 않으면 "공백 영역 추적" 오류가 발생합니다(모든 공백이 트리밍된 경우에도 "TextFX" > "TextFX 편집" > "Trim Trailing Spaces").

패치를 적용하려면 다음 단계를 수행해야 합니다.

  1. 패치 생성(결과는 다음과 같습니다)
  2. 문자 인코딩을 ANSI로 변환
  3. UNIX 형식으로 EOL 변환
  4. 패치를 적용합니다.

다음 스크린샷을 보십시오.

Applying a patch in Windows Powershell with Git is problematic

저는 Windows 사용자가 아니기 때문에 제 대답을 쉽게 받아들이십시오.윈도우즈 PowerShell Cookbook에 따르면 PowerShell은 다음의 출력을 사전 처리합니다.git diff그것을 줄로 쪼개는 것.Cmdlet에 대한 문서는 다음과 같이 제안합니다.>는 와동합다니와 .| Out-File매개 변수 없이.PowerShell 설명서에서도 다음과 같은 의견을 확인할 수 있습니다.

기존 출력 리디렉션에 익숙한 경우 Out-File cmdlet을 사용한 결과가 예상과 다를 수 있습니다.이 동작을 이해하려면 Out-File cmdlet이 작동하는 컨텍스트를 알고 있어야 합니다.

기본적으로 Out-File cmdlet은 유니코드 파일을 생성합니다.이는 장기적으로는 최상의 기본값이지만 ASCII 파일이 필요한 도구가 기본 출력 형식에서 제대로 작동하지 않는다는 것을 의미합니다.인코딩 매개 변수를 사용하여 기본 출력 형식을 ASCII로 변경할 수 있습니다.

[...]

아웃파일 형식 파일 내용을 콘솔 출력 형식으로 지정합니다.따라서 대부분의 경우 콘솔 창에서와 마찬가지로 출력이 잘립니다. [...]

화면 너비와 일치하도록 줄 바꿈을 강제 적용하지 않는 출력을 가져오려면 너비 매개 변수를 사용하여 줄 너비를 지정할 수 있습니다.

문자 인코딩을 선택한 것은 Git이 아닌 것 같습니다.Out-File이는 a) PowerShell 리디렉션을 텍스트에만 사용해야 한다는 것을 의미하며 b)

| Out-File -encoding ASCII -Width 2147483647 my.patch

인코딩 문제를 방지합니다.그러나 이것은 여전히 Windows와 관련된 문제를 해결하지 못합니다.Unix 줄 끝.줄 끝 부분을 변환할 수 있는 Cmdlet(PowerShell Community Extensions 참조)이 있습니다.

그러나 이 모든 기록이 패치(인코딩 자체는 없고 바이트 문자열에 불과함)에 대한 신뢰도를 높이지는 않습니다.의 Cookbook에는 수정되지 않은 명령 출력을 리디렉션하는 스크립트 Invoke-BinaryProcess가 포함되어 있습니다.

이 모든 문제를 회피하기 위한 대안은 다음과 같습니다.git format-patch대신에git diff.format-patch파일에 직접 쓰기(stdout이 아님)하므로 출력이 기록되지 않습니다.그러나 임의의 차이가 아닌 커밋에서만 패치를 생성할 수 있습니다.

format-patch커밋 범위를 사용합니다(예:master^10..master^5) 또는 단일 커밋(예: X, 즉 X..HEAD)를 사용하여 NNNN-Subject.patch 형식의 패치 파일을 생성합니다. 여기서 NNN은 4자리 숫자가 증가하고 주체는 패치의 (맹그된) 주체입니다.출력 디렉터리는 다음을 사용하여 지정할 수 있습니다.-o.

파워셸을 사용하면 다음 작업도 수행할 수 있습니다.

cmd /c "git diff > patch.diff"

이렇게 하면 명령이 CMD를 통해 실행되어 출력 파일에 그대로 기록됩니다.

PowerShell 대신 good old Command Prompt를 사용하면 문자 인코딩 및 EOL과 관련하여 PowerShell에 존재하는 문제가 전혀 발생하지 않습니다.

enter image description here

파워셸에서 생성된 diff에서 dos2unix를 하는 것은 저에게 효과가 있는 것 같습니다.그때 나는 할 수 있었습니다.apply성공적으로 디프

dos2unix.exe diff_file
git apply diff_file
  1. diffs의 Iconv 출력
  2. 일반 7비트 패치(순수 영어)의 경우 비정상적인 메모장++ 탐지를 무시할 수 있습니다. 패치 콘텐츠에 문자 집합 정의가 포함되어 있지 않습니다.

Lars Noschinski가 언급했듯이 당신은 출력을 수정해야 합니다.Out-File다음 명령을 사용하여 Out-File의 기본 매개 변수를 설정할 수 있습니다.

$PSDefaultParameterValues['Out-File:Encoding'] = 'ASCII'
$PSDefaultParameterValues['Out-File:Width'] = '2147483647'

한 후 Default 파터후는을 할 수 .>패치 파일을 내보냅니다.

그 두 줄을 내 프로필 파일에 추가한 후 모든 것이 예상대로 작동합니다.

λ git stash show -p > test3
C:\Users\..\Source\.. [master +1 ~0 -0 !]
λ git apply test3
C:\Users\..\Source\.. [master +1 ~2 -0 !]

언급URL : https://stackoverflow.com/questions/13675782/git-shell-in-windows-patchs-default-character-encoding-is-ucs-2-little-endian