git:修补程序没有有效的电子邮件地址

git:修补程序没有有效的电子邮件地址,git,patch,git-patch,Git,Patch,Git Patch,我有一个补丁文件 我想将此修补程序应用于git存储库中的代码 当我使用subversion时,这个过程非常简单:右键单击->乌龟svn->应用补丁。它总是像我预期的那样工作 但是我不能使用git来实现这一点。Git没有应用我的补丁。它抱怨 修补程序没有有效的电子邮件地址。 所以,我的问题是: “在这种情况下如何应用修补程序文件?”Git创建的修补程序将与Git工具一起应用。使用 git apply <patch> git应用 如果补丁不是用Git创建的,那么只需使用Git的“后台

我有一个补丁文件

我想将此修补程序应用于git存储库中的代码

当我使用subversion时,这个过程非常简单:右键单击->乌龟svn->应用补丁。它总是像我预期的那样工作

但是我不能使用git来实现这一点。Git没有应用我的补丁。它抱怨

修补程序没有有效的电子邮件地址。

所以,我的问题是:
“在这种情况下如何应用修补程序文件?”

Git创建的修补程序将与Git工具一起应用。使用

git apply <patch>
git应用
如果补丁不是用Git创建的,那么只需使用Git的“后台”补丁程序。通常这是程序“补丁”:

patch <patch>
补丁

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

如果使用图形界面而不是命令行对您更有帮助,那么有很多工具可以使在Git中执行很多事情相对简单,包括应用补丁)。我发现的最有用的一个是,但是如果你搜索的话,我肯定还有其他好的。这适用于许多开源项目使用的从pipermail下载的mbox文件。这在OP的情况下可能不起作用,但在使用
git am
和pipermail提取的消息/补丁时会产生相同的症状/问题


备份文件并对其进行编辑以添加一行

From: name@domain.com (Proper Name)
通常该行已经存在,但反垃圾邮件功能可能已将
@
符号转换为处的文本。您可以使用gnu
sed
命令修补一堆文件,如

sed -ie 's/\(From:.*\) at /\1@/' *.patch
这只是将“at”替换为
@
符号。在此之后,
git am
应该接受它


如果您有权访问git存储库,则可以使用常规命令

  • git签出oldbranch
  • git format patch HEAD~4
    这将生成四个文件,它们是上次更改的修补程序(更改案例的编号)
  • git签出主机
  • git am*.patch
  • 您将获得与远程存储库相同的提交ID、消息等,这在以后可能会很有用


    像gitk和kdiff这样的工具不会生成与format patch相同的数据,而且您不会获得提交历史记录。如果您有这种类型的数据,则必须使用git apply或如上所述生成修补程序


    请参阅:。

    如果您的提交消息的行以
    开头,则可能出现此错误:
    。例如,我有一个补丁修复了一个打字错误,在提交消息的正文中:

    Fixes a typo.
    From: 873524cab1 "Introduced some bug on this commit"
    
    由format patch生成的.patch文件有两行
    From:
    行,其中一行是电子邮件地址,另一行是我的糟糕消息。Git am从:行中提取第二个
    ,并试图找到电子邮件地址


    修复方法是将提交消息更改为在行首不包含
    From:

    确切地说,这个命令不起作用。我在上面写过git抱怨邮件丢失。你是用git创建补丁的吗?不是。这是由tortoise diff viewer生成的“统一”补丁格式。请参阅更新的答案;应用Git的“背后”补丁。在.patch文件中添加电子邮件地址后,Git抱怨缺少SHA哈希。我想我会试试GoZoner的答案。我有我当地的回购协议,其中一些源代码是一年前从国外项目复制过来的。与此同时,该项目以及我的本地回购协议也得到了更新。我想结合国外的改进。我通过将最新版本复制到旧分支并显示所有差异,对国外项目进行了修改。我还没有找到一个工具将这个统一的差异应用于我的本地回购。我最终用kdiff3实现了它,但没有使用我以前创建的补丁。