git:补丁没有有效的电子邮件地址

14
我有一个补丁文件。
我想将这个补丁应用到我的 Git 代码库中。
当我使用 Subversion 时,这个过程非常简单:右键单击->Tortoise SVN->应用补丁。它总是按照我的预期工作。
但是我不能使用 Git 进行此操作。Git 不适用我的补丁。它抱怨说:
“补丁没有有效的电子邮件地址。”
所以,我的问题是: 如何在这种情况下应用补丁文件?
4个回答

9

Git创建的补丁是为了使用Git工具而设计的。使用

git apply <patch>

如果补丁不是由Git创建的,则可以在Git“背后”使用补丁程序。通常使用的程序是“patch”:

patch <patch>

在应用补丁后,像往常一样在Git中添加和提交。

1
这个命令确实不起作用。我之前写过,git抱怨缺少电子邮件。 - tmporaries
你是用Git创建的补丁吗? - GoZoner
不是的。这是由Tortoise Diff Viewer生成的“统一”补丁格式。 - tmporaries
请查看更新的答案;在 Git 的“背后”应用补丁。 - GoZoner

6
这适用于从许多开源项目使用的pipermail下载的mbox文件。这可能不适用于OP的情况,但是当使用从pipermail提取的消息/补丁与git am一起使用时,会出现相同的症状/问题。
备份该文件并编辑以添加一行,
From: name@domain.com (Proper Name)

通常情况下,这条线路已经存在,但是反垃圾邮件功能可能会将@符号转换为文本at。你可以使用gnu sed命令批量修补文件,比如:

sed -ie 's/\(From:.*\) at /\1@/' *.patch

这只是将'at'替换为@符号。完成这个步骤后,git am应该能够接受它。


如果您可以访问git仓库,您可以使用常规命令:

  1. git checkout oldbranch
  2. git format-patch HEAD~4 这将生成四个文件,是最近更改的补丁(根据您的情况更改数字)。
  3. git checkout master
  4. git am *.patch

您将获得与远程存储库相同的提交ID、消息等信息,这在以后可能会有用。


gitkkdiff这样的工具不会生成与format-patch相同的数据,并且您无法获得提交历史记录。如果您有这种类型的数据,则必须使用git apply或像上面一样生成补丁。

参见:git format-patch和git diff之间的区别


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Dženan
我有一个本地仓库,其中一年前从外部项目复制了一些源代码。与此同时,该项目已经更新,我的本地仓库也进行了更新。我想将外部的改进合并到我的本地仓库中。我通过将最新版本复制到旧分支中并显示所有差异来创建了一个补丁,以包含对外部项目所做的更改。但我仍然没有找到一个工具可以将这个统一的差异应用到我的本地仓库中。 - Dženan
我最终使用kdiff3完成了,但没有使用之前创建的补丁。 - Dženan

1
如果您更喜欢使用图形界面而不是命令行,有很多工具可以使Git的许多操作变得相对简单,包括应用补丁。我发现最有帮助的是SourceTree,但是如果您搜索,肯定会找到其他好用的工具。

1
如果您的提交信息中有一行以From:开头,可能会出现此错误。例如,我有一个修复错别字的补丁,在提交消息正文中,我写了以下内容:
Fixes a typo.
From: 873524cab1 "Introduced some bug on this commit"

由 format-patch 生成的 .patch 文件有两个 From: 行,一个是电子邮件地址,另一个是我糟糕的消息。Git am 会获取第二个 From: 行并尝试查找电子邮件地址。
解决方法是更改提交消息,不要在行首使用 From:

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接