42

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

我怎样才能改变这种行为,并强制 git 在没有 BOM 字符编码的情况下使用 ANSI 或 UTF-8 创建补丁?

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

创建 git 补丁

Notepad++ 字符编码截图


从那时起,我也意识到我必须在 Notepad++中手动将 EOL 从 Windows 格式 ( \r\n) 转换为 UNIX ( )(编辑 > EOL 转换 > UNIX)。\n如果我不这样做,我会收到“尾随空格”错误(即使所有空格都被修剪:“TextFX”>“TextFX 编辑”>“修剪尾随空格”)。

因此,我需要执行以下步骤才能应用补丁:

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

请看一下这个截图:

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

4

6 回答 6

20

我不是 Windows 用户,所以对我的回答持保留态度。根据Windows PowerShell Cookbook,PowerShell 对 的输出进行预处理git diff,将其分成几行。Cmdlet的文档Out-File表明,这与没有参数>的情况相同。| 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

将避免编码问题。但是,这仍然不能解决 Windows 与 Unix 行尾的问题。有 Cmdlet(请参阅PowerShell Community Extensions)来转换行尾。

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

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

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

于 2012-12-06T20:05:21.243 回答
14

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

cmd /c "git diff > patch.diff"

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

于 2017-07-06T07:25:08.327 回答
5

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

在此处输入图像描述

于 2016-08-05T20:22:03.477 回答
1
  1. 差异的 Iconv 输出
  2. 对于纯 7 位补丁(纯英文),您可以忽略疯狂的 Notepad++ 检测:补丁内容不包含任何字符集定义
于 2012-12-02T04:00:01.313 回答
1

在 powershell 上生成的差异上执行 dos2unix 似乎对我有用。然后我能够apply成功进行差异化。

dos2unix.exe diff_file
git apply diff_file
于 2017-07-18T23:56:59.997 回答
0

正如 Lars Noschinski 所说,您需要修复Out-File. 您可以使用以下命令设置 Out-File 的 DefaultParameter。

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

设置默认参数后,您可以使用>导出补丁文件。

将这两行添加到我的配置文件后,一切都按预期工作。

λ git stash show -p > test3
C:\Users\..\Source\.. [master +1 ~0 -0 !]
λ git apply test3
C:\Users\..\Source\.. [master +1 ~2 -0 !]
于 2018-05-08T13:26:40.483 回答