17

我有一个浅克隆,我在上面做了三个提交。这是日志:

$ git log --oneline --graph --decorate --all
* d3456fd (HEAD, master) patch 3
* 9713822 patch 2
* 6f380a6 patch 1
* 8a1ce1e (origin/master, origin/HEAD) from full clone
* 7c13416 added from浅
* 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) from full clone
* 7c13416 added from shallow
* 3b3ed39 removed email
* cfbed6c 进一步修改
* a71254b 添加到 release 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 起源 > ../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:尾随空格。
patch 这个报告
错误:patch failed:file1.c:6
error:file1.c:patch does not apply
error:patch failed:file1.xml:2
error:file1.xml:patch does not apply
error:patch failed:tr/ test_report.txt:2
错误:tr/test_report.txt:补丁不适用

4

3 回答 3

18

请注意,必须忽略空格的一个理由是(2010 年 6 月):

它所做的是启用GMail -> download -> git-am workflow.
GMail(当然还有无数其他)电子邮件提供商在原始电子邮件消息的开头引入了空格,而在其他情况下则保持原样。

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

 git am --keep-cr

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

OP maxmelbin评论中确认以下工作:

 git am -3 --keep-cr --committer-date-is-author-date /c/temp/git/format_since_origin.patch
于 2012-11-02T07:15:38.473 回答
14

当 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 完全拒绝有任何错误的补丁,但 patch -p1 会逐个工作,尽可能多地应用单独的更改。它在修改之前将每个文件备份为 filename.ext.orig 并将被拒绝的大块保存在filename.ext.rej. 丢弃 .orig 文件并手动应用 .rej 中留下的更改。对于小补丁来说,这是一个简单的策略。

于 2014-11-18T11:50:24.903 回答
9

行。以下工作。

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

于 2012-11-02T07:01:54.463 回答