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.如果我不这样做,我会收到"致命:无法识别的输入"错误.
从那时起,我也意识到我必须在Notepad ++(编辑> EOL转换> UNIX)中手动将EOL从Windows格式(\r\n)转换为UNIX(\n).如果我不这样做,我会得到"尾随空格"错误(即使修剪了所有空格:"TextFX">"TextFX Edit">"Trim Trailing Spaces").
那么,我需要为要应用的补丁执行以下步骤:
请看一下这个截图:
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按原样写入输出文件.
如果这对任何人都有帮助,使用旧的命令提示符而不是 PowerShell 可以完美地工作;它似乎没有受到 PowerShell 中存在的有关字符编码和 EOL 的任何问题的影响。
| 归档时间: |
|
| 查看次数: |
13137 次 |
| 最近记录: |