【发布时间】:2013-06-25 06:22:35
【问题描述】:
我有一个补丁文件。
我想将此补丁应用到我在 git 存储库中的代码。
当我使用 subversion 时,这个过程非常简单:右键单击 -> tortoise svn -> 应用补丁。它总是按我的预期工作。
但是我不能使用 git 来做到这一点。 Git 没有应用我的补丁。它抱怨
补丁没有有效的电子邮件地址。
所以,我的问题是: “在这种情况下如何应用补丁文件?”
【问题讨论】:
我有一个补丁文件。
我想将此补丁应用到我在 git 存储库中的代码。
当我使用 subversion 时,这个过程非常简单:右键单击 -> tortoise svn -> 应用补丁。它总是按我的预期工作。
但是我不能使用 git 来做到这一点。 Git 没有应用我的补丁。它抱怨
补丁没有有效的电子邮件地址。
所以,我的问题是: “在这种情况下如何应用补丁文件?”
【问题讨论】:
如果您的提交消息中有一行以From: 开头,则可能会出现此错误。例如,我有一个补丁修复了一个错字,在提交消息的正文中我有:
Fixes a typo.
From: 873524cab1 "Introduced some bug on this commit"
由 format-patch 生成的 .patch 文件有两行 From: 行,其中一行是电子邮件地址,另一行是我的糟糕消息。 Git am 拿起第二行 From: 并试图找到电子邮件地址。
解决方法是将提交消息更改为在行首不包含From:。
【讨论】:
这适用于从许多开源项目使用的 pipermail 下载的 mbox 文件。这在 OP 的情况下可能不起作用,但在使用 git am 和 pipermail 提取的消息/补丁时会产生相同的症状/问题。
备份文件并编辑它以添加一行,
From: name@domain.com (Proper Name)
通常该行已经存在,但反垃圾邮件功能可能已将@ 符号转换为文本at。您可以使用 gnu sed 命令修补一堆文件,例如,
sed -ie 's/\(From:.*\) at /\1@/' *.patch
这只是用@ 符号替换'at'。在这之后,git am 应该接受它。
如果您可以访问 git 存储库,则可以使用常规命令,
git checkout oldbranch git format-patch HEAD~4 这将生成四个文件,它们是上次更改的补丁(更改您的案例的编号)。 git checkout master git am *.patch您会获得与远程存储库相同的提交 ID、消息等,这些在以后会很有用。
gitk 和 kdiff 之类的工具会不 生成与 format-patch 相同的数据,而您不会t 获取提交历史记录。如果您有此类数据,则必须使用git apply 或按上述方式生成补丁。
【讨论】:
Git 创建的补丁旨在与 Git 工具一起应用。使用
git apply <patch>
如果补丁不是用 Git 创建的,那么只需在 Git 的“背后”使用补丁程序。通常这是程序“补丁”:
patch <patch>
应用补丁后,像往常一样在 Git 中添加和提交。
【讨论】:
如果使用图形界面而不是命令行对您更有帮助,那么有很多工具可以让您在 Git 中做很多事情变得相对简单,包括应用补丁)。我找到的最有用的是SourceTree,但如果你搜索的话,我相信还有其他不错的。
【讨论】: