在git中应用补丁时出错

时间:2012-11-02 06:54:52

标签: git

我有一个浅层克隆,我做了三次提交。 这是日志:

  

$ git log --oneline --graph --decorate --all
  * d3456fd(HEAD,master)补丁3
  * 9713822补丁2
  * 6f380a6补丁1
  *来自完整克隆的8a1ce1e(origin / master,origin / HEAD)
  * 7c13416从浅浅添加   * 3b3ed39删除了电子邮件
  * cfbed6c进一步修改
  * a71254b为2.1版添加   * 7347896(移植)对第2版的更改

现在我从这里创建一个补丁:

  

$ git format-patch -k --stdout origin> ../format_since_origin.patch

我想在另一个克隆中应用此补丁,这是一个完整的克隆 这是日志:

  

$ git log --oneline --graph --decorate --all
  *来自完整克隆的8a1ce1e(HEAD,origin / master,master)   * 7c13416从浅浅添加   * 3b3ed39删除了电子邮件
  * cfbed6c进一步修改
  * a71254b为2.1版添加   * 7347896发布2的更改   * b1a8797更改为ttwo文件
  * 603710c更改了测试报告
  * 16b20b3添加了test_report.txt
  * f0871ea修改了file1.xml
  * dd94bfc添加了file1.xml
  * 00758aa第二次提交   * 49f9968首次提交

我无法应用上面浅层克隆创建的补丁。我收到以下错误。

  

$ git am -3 /c/temp/git/format_since_origin.patch
  适用:补丁1
  使用索引信息重建基础树...
  错误:补丁失败:file1.c:6
  错误:file1.c:补丁不适用
  你有没有手动编辑你的补丁?   它不适用于其索引中记录的blob   不能回退到三方合并   修补程序在0001补丁1时失败   当你解决了这个问题后,运行“git am --resolved”   如果您希望跳过此补丁,请运行“git am --skip”   要恢复原始分支并停止修补运行“git am --abort”。

知道这个补丁失败的原因吗?或者我的方法完全错了?

更新

适用于以下

  

$ git am -3 --ignore-whitespace /c/temp/git/format_since_origin.patch   适用:补丁1   适用:补丁2   适用:补丁3

现在,正如查尔斯所建议的那样 - 如果我尝试使用git diff,我会得到如下错误。

  

$ git diff -p origin> ../dif_origin.patch

申请时,

  

$ git apply --ignore-whitespace --inaccurate-eof /c/temp/git/dif_origin.patch
  c:/temp/git/dif_origin.patch:9:尾随空格。
  file1.c的补丁更改
  c:/temp/git/dif_origin.patch:18:尾随空格。
  补丁这个xml的家伙   c:/temp/git/dif_origin.patch:29:尾随空格。
  fsdfsd
  c:/temp/git/dif_origin.patch:30:尾随空格。
  修补此报告
  错误:补丁失败:file1.c:6
  错误:file1.c:补丁不适用
  错误:补丁失败:file1.xml:2
  错误:file1.xml:补丁不适用
  错误:补丁失败:tr / test_report.txt:2
  错误:tr / test_report.txt:补丁不适用

3 个答案:

答案 0 :(得分:13)

请注意,必须忽略空格的一个基本原理是(June 2010):

  

它的作用是启用GMail -> download -> git-am workflow   GMail(以及无数其他无数的)电子邮件提供商在原始电子邮件消息的开头引入空格,否则将保持原样。

如“git am/format-patch: control format of line endings”中所述,您可以尝试:

 git am --keep-cr

这不需要你忽略空格(仅警告)。

OP maxmelbin确认以下有效的in the comments

 git am -3 --keep-cr --committer-date-is-author-date /c/temp/git/format_since_origin.patch

答案 1 :(得分:11)

当git apply正常工作时,你根本就没有输出:

$ git apply example.patch
[nothing returned]

如果你想看看幕后发生了什么,你可以使用-v(详细)标志:

$ git apply -v example.patch
Checking patch includes/common.inc...
Applied patch includes/common.inc cleanly.

但是,如果在你自己的本地git工作副本中运行git apply,那么即使使用-v(详细)标志,git apply也不会执行任何操作,并且不提供任何输出。如果发生这种情况,请检查您在目录树中的位置 - git apply可能在其他位置工作。

git apply的替代方法是使用patch命令:

$ patch -p1 < example.patch

这是git apply命令可以生成的其他输出,以及它的含义。 补丁不适用

$ git apply example.patch
error: patch failed: includes/common.inc:626
error: includes/common.inc: patch does not apply``

Git无法应用补丁中的更改,因为它无法找到相关代码行;它们必须已被另一次提交更改或删除。试试这些:

确保补丁尚未应用。在git-log中查找它或者只是检查代码以查看更改是否已经存在。如果他们是,你就完成了。如果他们不是或者只是其中一些人,请尝试别的:

使用patch -p1 < filename.patch。虽然git-apply完全拒绝任何有错误的补丁,但补丁-p1会按照hunk工作,尽可能多地应用个别更改。它在修改文件之前将每个文件备份为filename.ext.orig,并在filename.ext.rej中保存被拒绝的文件。丢弃.orig文件并手动应用.rej中剩余的更改。对于小补丁来说,这是一个简单的策略。

答案 2 :(得分:8)

确定。以下工作。

  

$ git am -3 --ignore-whitespace /c/temp/git/format_since_origin.patch
  适用:补丁1
  适用:补丁2
  适用:补丁3

为什么我在申请时需要忽略空格?