Windows中的Git Shell:补丁的默认字符编码是UCS-2 Little Endian - 如何在没有BOM的情况下将其更改为ANSI或UTF-8?

Sk8*_*ter 38 git powershell encoding github

在Windows中使用Git Shell创建diff补丁(当使用GitHub for Windows时),根据Notepad ++ ,补丁的字符编码将是UCS-2 Little Endian(参见下面的屏幕截图).

如何更改此行为,并强制git使用ANSI或UTF-8创建没有BOM字符编码的补丁?

它会导致问题,因为无法应用UCS-2 Little Endian编码补丁,我必须手动将其转换为ANSI.如果我不这样做,我会收到"致命:无法识别的输入"错误.

创建git补丁

Notepad ++字符编码的截图


从那时起,我也意识到我必须在Notepad ++(编辑> EOL转换> UNIX)中手动将EOL从Windows格式(\r\n)转换为UNIX(\n).如果我不这样做,我会得到"尾随空格"错误(即使修剪了所有空格:"TextFX">"TextFX Edit">"Trim Trailing Spaces").

那么,我需要为要应用的补丁执行以下步骤:

  1. 创建补丁(这是结果)
  2. 将字符编码转换为ANSI
  3. EOL转换为UNIX格式
  4. 应用补丁

请看一下这个截图:

使用Git在Windows Powershell中应用补丁是有问题的

Lar*_*ski 20

我不是Windows用户,所以请耐心等待我的回答.根据Windows PowerShell Cookbook,PowerShell预处理输出git diff,将其拆分为行.Out-FileCmdlet的文档表明,这>| Out-File没有参数的情况相同.我们还在PowerShell文档中找到了这条评论:

如果您习惯于传统的输出重定向,则使用Out-File cmdlet的结果可能不是您所期望的.要了解其行为,您必须了解Out-File cmdlet的运行环境.

默认情况下,Out-File cmdlet创建Unicode文件.从长远来看,这是最好的默认设置,但这意味着期望ASCII文件的工具无法使用默认输出格式正常工作.您可以使用Encoding参数将默认输出格式更改为ASCII:

[...]

Out-file格式化文件内容,使其看起来像控制台输出.在大多数情况下,这会导致输出被截断,就像它在控制台窗口中一样.[...]

要获得不强制换行以匹配屏幕宽度的输出,可以使用Width参数指定行宽.

所以,显然不是Git选择字符编码,而是Out-File.这表明a)PowerShell重定向确实只应用于文本和b)

| Out-File -encoding ASCII -Width 2147483647 my.patch
Run Code Online (Sandbox Code Playgroud)

将避免编码问题.但是,这仍然无法解决Windows与Unix行结尾的问题.有Cmdlet(请参阅PowerShell社区扩展)来进行行结尾的转换.

但是,所有这些重新编码都不会增加我对补丁(它本身没有编码,但只是一串字节)的信心.上述Cookbook包含一个脚本Invoke-BinaryProcess,可用于重定向未修改命令的输出.

为了回避整个问题,另一种方法是使用git format-patch而不是git diff.format-patch直接写入文件(而不是stdout),因此不会重新编码其输出.但是,它只能从提交创建补丁,而不是任意差异.

format-patch采用提交范围(例如master^10..master^5)或单个提交(例如X,意思是X..HEAD)并创建NNNN-SUBJECT.patch形式的补丁文件,其中NNNN是增加的4位数字,主题是(损坏的)补丁的主题.可以使用指定输出目录-o.


小智 8

如果你使用powershell,你也可以这样做:

cmd /c "git diff > patch.diff"
Run Code Online (Sandbox Code Playgroud)

这使命令通过CMD运行,CMD按原样写入输出文件.


Dan*_*zzi 5

如果这对任何人都有帮助,使用旧的命令提示符而不是 PowerShell 可以完美地工作;它似乎没有受到 PowerShell 中存在的有关字符编码和 EOL 的任何问题的影响。

在此处输入图片说明