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
我们尝试调试了几个小时。最终起作用的是:
- 使用类似
VS Code
的编辑器打开补丁文件
- 编码更改为
UTF-8
- 将行结尾从
CRLF
更改为 LF
- 保存新文件
git apply myPatch.patch
有效
补丁文件格式有问题。修复路径文件:
在记事本++中打开你的补丁文件,然后进入这两个菜单:
Encoding/Convert to UTF-8
Edit/EOL conversion/Unix (LF)
运行:
git apply --reject --whitespace=fix your_patch.patch
在 Windows,对于 Visual Studio:
- 打开文件
- 从菜单:文件 -> 保存 文件名 为...
- Select 'Save with Encoding...'
- Select 以下内容:
- 编码:UTF-8 with/without 签名
- 行尾:Unix (LF)
- 保存文件
- 运行
git apply MyPatch.patch
再一次
Windows中的快速解决方案:
- 打开记事本
- 将您的
git diff
内容复制到记事本中的空白文档
- 另存为新文件
git apply
文件
复制内容很重要,而不仅仅是在记事本中打开 diff 文件。
我是 运行 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
我们尝试调试了几个小时。最终起作用的是:
- 使用类似
VS Code
的编辑器打开补丁文件
- 编码更改为
UTF-8
- 将行结尾从
CRLF
更改为LF
- 保存新文件
git apply myPatch.patch
有效
补丁文件格式有问题。修复路径文件:
在记事本++中打开你的补丁文件,然后进入这两个菜单:
Encoding/Convert to UTF-8 Edit/EOL conversion/Unix (LF)
运行:
git apply --reject --whitespace=fix your_patch.patch
在 Windows,对于 Visual Studio:
- 打开文件
- 从菜单:文件 -> 保存 文件名 为...
- Select 'Save with Encoding...'
- Select 以下内容:
- 编码:UTF-8 with/without 签名
- 行尾:Unix (LF)
- 保存文件
- 运行
git apply MyPatch.patch
再一次
Windows中的快速解决方案:
- 打开记事本
- 将您的
git diff
内容复制到记事本中的空白文档 - 另存为新文件
git apply
文件
复制内容很重要,而不仅仅是在记事本中打开 diff 文件。