Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Powershell Windows中的Git Shell:patch';s的默认字符编码是UCS-2 Little Endian-如何在没有BOM的情况下将其更改为ANSI或UTF-8?_Powershell_Git_Encoding_Github - Fatal编程技术网

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

Powershell Windows中的Git Shell:patch';s的默认字符编码是UCS-2 Little Endian-如何在没有BOM的情况下将其更改为ANSI或UTF-8?,powershell,git,encoding,github,Powershell,Git,Encoding,Github,在Windows中使用Git Shell创建差异修补程序时(使用时),修补程序的字符编码将根据Notepad++UCS-2 Little-Endian(参见下面的屏幕截图) 如何改变这种行为,并强制git使用ANSI或UTF-8创建补丁,而不使用BOM字符编码 这导致了一个问题,因为UCS-2 Little Endian编码的补丁无法应用,我必须手动将其转换为ANSI。如果不这样做,则会出现“致命:无法识别的输入”错误 从那时起,我还意识到我必须在记事本++(编辑>EOL转换>UNIX)中

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

如何改变这种行为,并强制git使用ANSI或UTF-8创建补丁,而不使用BOM字符编码

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


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

因此,要应用修补程序,我需要执行以下步骤:

  • 创建修补程序()
  • 应用补丁
  • 请看一下这个屏幕截图:

  • diff的Iconv输出
  • 对于纯7bit补丁(纯英语),您可以忽略疯狂记事本++检测:补丁内容不包含任何字符集定义

  • 我不是Windows用户,所以对我的回答持保留态度。根据,PowerShell将对git diff的输出进行预处理,并将其拆分成行。Cmdlet的文档表明,
    与不带参数的
    | Out文件
    相同。我们还发现以下评论:

    如果习惯于传统的输出重定向,则使用Out-File cmdlet的结果可能与您预期的不同。要了解其行为,必须了解Out-File cmdlet操作的上下文

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

    [……]

    Out file将文件内容格式化为类似于控制台输出。这会导致输出被截断,就像在大多数情况下控制台窗口中一样。[……]

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

    因此,显然选择字符编码的不是Git,而是文件。这表明a)PowerShell重定向真的应该只用于文本,b)它

    将避免编码问题。但是,这仍然不能解决Windows与Unix行结尾的问题。有cmdlet(请参阅)用于转换行尾

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


    为了避免这个问题,另一种方法是使用
    git格式补丁
    而不是
    git-diff
    <代码>格式化补丁直接写入文件(而不是标准输出),因此其输出不会被重新编码。但是,它只能从提交创建修补程序,而不能创建任意差异


    format patch
    采用提交范围(例如
    master^10..master ^5
    )或单个提交(例如X,意思是X..HEAD),并创建格式为NNNN-SUBJECT.patch的补丁文件,其中NNNN是一个递增的4位数,SUBJECT是补丁的(损坏的)主题。可以使用
    -o

    指定输出目录,以防这对任何人都有帮助,使用良好的旧命令提示符而不是PowerShell可以完美地工作;它似乎没有遇到PowerShell中关于字符编码和EOL的任何问题


    如果您使用powershell,还可以执行以下操作:

    cmd /c "git diff > patch.diff"
    

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

    在powershell上生成的diff上执行dos2unix似乎可以帮我解决这个问题。然后,我成功地
    应用了
    差异

    dos2unix.exe diff_file
    git apply diff_file
    

    正如Lars Noschinski所提到的,您需要修复
    输出文件的输出。可以使用以下命令设置Out文件的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 !]
    

    感谢您的回答,但是1.)为什么
    iconv
    -ing与在记事本++中手动转换字符编码不同?2.)为什么忽略字符编码可以解决这些UCS2 Little Endian编码补丁无法应用的问题?请看一下这个屏幕截图:。如您所见,我收到错误消息“致命:无法识别的输入”。我还认识到,我必须在Notepad++中手动将EOL从Windows类型转换为UNIX。一旦我将补丁转换成ANSI,将EOL转换成UNIX,问题就消失了……很有趣。请看一下我编辑的问题,我又放了一些截图!谢谢嗯,我不知道这个案子,你可以问问当地的git粉丝。您可以在另一个Git客户端上尝试相同的操作(它们可以不同地操作)。这并不是对这个问题的直接回答,但是,为应用程序创建补丁的标准方法,不仅是人类消费不是
    Git diff
    ,而是
    Git format patch
    ——因为默认情况下这不会输出到标准输出,我想您不会对字符编码有任何问题。@cebewee:谢谢,在这种情况下我应该如何使用它?那么我应该如何定义输出文件的名称呢
    λ git stash show -p > test3
    C:\Users\..\Source\.. [master +1 ~0 -0 !]
    λ git apply test3
    C:\Users\..\Source\.. [master +1 ~2 -0 !]