fit*_*thu 13 git version-control
我试图在我的仓库中应用一些补丁,并获取消息,patch does not apply
除非我指定params --ignore-space-change --ignore-whitespace
.即使使用这些密钥也无法应用某些补丁,它表示存在需要手动解决的冲突.(但实际上没有任何冲突,自动合并必须解决这个问题)
我做了一个实验:从我的repo中的提交创建一个补丁,将master重置为上一次提交,尝试从文件中应用补丁.相同的错误消息.
任何想法,为什么会发生这种情况?
UPD命令非常简单:
git format-patch -o ../_patches 0f3bf7874c32b22256ae2d9dc00b1afd6464e43c
git reset --hard 0f3bf7874c32b22256ae2d9dc00b1afd6464e43c
git am ../_patches/0001-test2.patch
Run Code Online (Sandbox Code Playgroud)
(此id指的是最后一次提交)
Joh*_*ter 15
你需要将--keep-cr
旗帜传递给git am
.这很不幸,但由于竞争标准(电子邮件工作流程与本地工作流程),实际上没有多少选择.
您可能还想尝试设置.gitattributes
文件.试图重新创建您的问题,当我将文件指定为需要CRLF时,我能够将工作变为现实.请注意,在没有首先规范化文件的情况下,它确实将整个文件显示为已修改.我通常使用.gitattributes
这个:
.gitattributes export-ignore
.gitignore export-ignore
*.txt text
*.C text trailing-space space-before-tab -indent-with-non-tab
*.rst text trailing-space space-before-tab -indent-with-non-tab
*.clj text trailing-space space-before-tab -indent-with-non-tab
*.c text diff=cpp trailing-space space-before-tab -indent-with-non-tab
*.cpp text diff=cpp trailing-space space-before-tab -indent-with-non-tab
*.h text diff=cpp trailing-space space-before-tab -indent-with-non-tab
*.hpp text diff=cpp trailing-space space-before-tab -indent-with-non-tab
*.py text diff=python trailing-space space-before-tab -indent-with-non-tab
*.tex text diff=tex
*.java text diff=java trailing-space space-before-tab -indent-with-non-tab
*.pl text diff=perl trailing-space space-before-tab -indent-with-non-tab
*.php text diff=php
*.rb text diff=ruby trailing-space space-before-tab -indent-with-non-tab
*.vcproj eol=crlf
*.dsp eol=crlf
*.dsw eol=crlf
*.sh eol=lf
*.jpg binary
*.png binary
*.gif binary
*.tiff binary
Run Code Online (Sandbox Code Playgroud)
您需要根据gitattributes手册页规范化您的行结尾.另一个SO用户最终关闭core.autocrlf
以及得到干净的提交和补丁.
试图重现你的错误
$ git init repo
Initialized empty Git repository in c:/tmp/git-eol/repo/.git/
$ cd repo
$ git config --local core.autocrlf false
$ vim foo.txt
$ git add foo.txt
$ git commit -m "Add foo."
[master (root-commit) 3903abd] Add foo.
1 file changed, 3 insertions(+)
create mode 100644 foo.txt
$ vim foo.txt
$ git st
## master
M foo.txt
$ git commit -m "Add more foo." -a
[master 03e991a] Add more foo.
1 file changed, 2 insertions(+)
$ git format-patch HEAD~1
0001-Add-more-foo.patch
$ vim 0001-Add-more-foo.patch
Run Code Online (Sandbox Code Playgroud)
查看生成的补丁文件,我看到了:
如您所见,回车^M
中保留了回车符.这是core.autocrlf=false
.继续,我看到:
$ git reset --hard HEAD~1
HEAD is now at 3903abd Add foo.
$ git am 0001-Add-more-foo.patch
Applying: Add more foo.
error: patch failed: foo.txt:1
error: foo.txt: patch does not apply
Patch failed at 0001 Add more foo.
The copy of the patch that failed is found in:
c:/tmp/git-eol/repo/.git/rebase-apply/patch
When you have resolved this problem, run "git am --resolved".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".
$ git am --abort
Run Code Online (Sandbox Code Playgroud)
因此补丁不适用于开箱即用.使用--keep-cr
如预期的那样:
$ git am --keep-cr 0001-Add-more-foo.patch
Applying: Add more foo.
$
Run Code Online (Sandbox Code Playgroud)
好的.所以让我们尝试使用core.autocrlf=true
(在不同的存储库中):
# Removed the initial commands...
$ git format-patch HEAD~1
0001-Add-more-foo.patch
$ git reset --hard HEAD~1
HEAD is now at 525b5aa Initial commit.
$ git am 0001-Add-more-foo.patch
Applying: Add more foo.
$ git config --get core.autocrlf
true
Run Code Online (Sandbox Code Playgroud)
在这种情况下,补丁到处都有LF结尾.
啊哈!看来我已经找到原因了 存储库使用 CRLF 行结尾,但 format-patch 创建带有 LF 的补丁文件。当我使用 autocrlf=false 从头开始创建一个存储库并进行相同的实验时,我遇到了同样的问题。(看起来像 Git 中的错误)
有什么建议如何解决这个问题吗?
UPD 我的解决方案是使用 autocrlf=true 创建一个新的存储库,并将两个存储库中的所有更改重新导入其中。