git 补丁导致错误无法识别的输入

git patches cause error unrecognized input

我是 运行 Mac OSX 10.9.4 (Mavericks) 并且有 git 版本 2.8.2。我已经用一个全新的回购协议对此进行了测试。这是例子。

mkdir gitest
cd gitest
git init
echo "monkeyface" > monkey.txt
git commit -m "first commit"
echo "monkeyface farted" > monkeyfart.txt
git add .
git diff HEAD > new.patch
rm monkeyfart.txt
git reset --hard HEAD
git apply new.patch --check
>fatal: unrecognized input

知道是什么原因造成的吗?它可以是我的 .gitconfig 文件中的任何内容吗?

[user]
    name = myusername
    email = myemail@mail.com
[color]
  ui = always
[alias]
  st = status -sb -uall
  lg = log --decorate --pretty=oneline --abbrev-commit --graph
  undocommit = reset --soft HEAD^
  undopush = push -f origin HEAD^:master
[core]
    editor = vim
    excludesfile = ~/.gitignore_global
    pager = less -r
[commit]
  template = ~/.gitmessage.txt
[filter "media"]
    clean = git-media-clean %f
    smudge = git-media-smudge %f

更新:

虽然下面链接的答案提供了一些关于可能是什么问题的想法,但我的问题特别隐藏在我的配置中,因为没有颜色参数被传递到命令中。这个答案是相关的,但我的问题和答案可能对其他可能遇到类似问题的人有所帮助。

Extract changes from diff file to current branch

已更新

首先是在创建补丁时忽略颜色

git diff --no-color > my_patch.patch

您可能有一个未编码为 UTF-8 的文件。要在 *nix 系统(MacOS、Linux 等)上修复此问题

iconv -f ascii -t utf-8 fix.patch -o fix_utf8.patch

对于windows你可以尝试:

Get-Content .\fix.patch | Set-Content -Encoding utf8 fix_utf8.patch

如果您的文件中可能已经有颜色代码,您可以尝试:

git apply --reject --whitespace myfile.patch

也传入无颜色参数 git diff HEAD --color=never > fix.patch

现在检查 returns 没有错误消息。

git apply fix.patch --check

更改我的 .git 配置文件

[color]
    ui = always

更改为始终

[color]
    ui = auto

解决了我的问题,因此在比较补丁文件时我不必传递颜色选项。

更新:根据 saurabheights 的回答,你甚至不需要 brew link gnu-sed,你可以用 pearl 做到这一点。这也会从坏补丁文件中删除彩色字符。可能有很多方法可以做到这一点。

perl -pe 's/\x1b.*?[mGKH]//g' bad.patch > good.patch

对于那些已经有颜色代码补丁的人,试试这个:-

Ubuntu:-

cat incorrect.patch | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" > correct.patch

Mac 上,使用以下命令安装 gsed:-

brew link gnu-sed

并生成正确的补丁文件:-

cat incorrect.patch | gsed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g" > correct.patch

我们尝试调试了几个小时。最终起作用的是:

  1. 使用类似 VS Code
  2. 的编辑器打开补丁文件
  3. 编码更改为 UTF-8
  4. 将行结尾从 CRLF 更改为 LF
  5. 保存新文件
  6. git apply myPatch.patch 有效

补丁文件格式有问题。修复路径文件:

  1. 在记事本++中打开你的补丁文件,然后进入这两个菜单:

    Encoding/Convert to UTF-8
    Edit/EOL conversion/Unix (LF)
    
  2. 运行:

    git apply --reject --whitespace=fix your_patch.patch
    

在 Windows,对于 Visual Studio:

  1. 打开文件
  2. 从菜单:文件 -> 保存 文件名 为...
  3. Select 'Save with Encoding...'

  1. Select 以下内容:
    • 编码:UTF-8 with/without 签名
    • 行尾:Unix (LF)

  1. 保存文件
  2. 运行 git apply MyPatch.patch 再一次

Windows中的快速解决方案:

  1. 打开记事本
  2. 将您的 git diff 内容复制到记事本中的空白文档
  3. 另存为新文件
  4. git apply 文件

复制内容很重要,而不仅仅是在记事本中打开 diff 文件。