【问题标题】:git: Patch does not have a valid e-mail addressgit:补丁没有有效的电子邮件地址
【发布时间】:2013-06-25 06:22:35
【问题描述】:

我有一个补丁文件。

我想将此补丁应用到我在 git 存储库中的代码。

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

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

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

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

【问题讨论】:

    标签: git patch git-patch


    【解决方案1】:

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

    Fixes a typo.
    From: 873524cab1 "Introduced some bug on this commit"
    

    由 format-patch 生成的 .patch 文件有两行 From: 行,其中一行是电子邮件地址,另一行是我的糟糕消息。 Git am 拿起第二行 From: 并试图找到电子邮件地址。

    解决方法是将提交消息更改为在行首不包含From:。

    【讨论】:

      【解决方案2】:

      这适用于从许多开源项目使用的 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 存储库,则可以使用常规命令,

      1. git checkout oldbranch
      2. git format-patch HEAD~4 这将生成四个文件,它们是上次更改的补丁(更改您的案例的编号)。
      3. git checkout master
      4. git am *.patch

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


      gitk 和 kdiff 之类的工具会不 生成与 format-patch 相同的数据,而您不会t 获取提交历史记录。如果您有此类数据,则必须使用git apply 或按上述方式生成补丁。

      请参阅:Difference between git format-patch and git diff。

      【讨论】:

      • 在 .patch 文件中添加电子邮件地址后,git 抱怨缺少 SHA 哈希。我想我会尝试 GoZoner 的答案。
      • 我有我的本地仓库,其中一些源代码是一年前从国外项目复制的。同时,该项目以及我的本地存储库都已更新。我想结合国外的改进。我通过将最新版本复制到旧分支并显示所有差异来对外国项目进行了更改。我还没有找到可以将此统一差异应用到我的本地存储库的工具。
      • 我终于用kdiff3做到了,但没有使用我之前创建的补丁。
      【解决方案3】:

      Git 创建的补丁旨在与 Git 工具一起应用。使用

      git apply <patch>
      

      如果补丁不是用 Git 创建的,那么只需在 Git 的“背后”使用补丁程序。通常这是程序“补丁”:

      patch <patch>
      

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

      【讨论】:

      • 正是这个命令不起作用。我在上面写过 git 抱怨错过了电子邮件。
      • 你是用 Git 创建补丁的吗?
      • 没有。这是由 tortoise diff viewer 生成的“统一”补丁格式。
      • 查看更新的答案;在 Git 的“背后”应用补丁。
      【解决方案4】:

      如果使用图形界面而不是命令行对您更有帮助,那么有很多工具可以让您在 Git 中做很多事情变得相对简单,包括应用补丁)。我找到的最有用的是SourceTree,但如果你搜索的话,我相信还有其他不错的。

      【讨论】:

        猜你喜欢
        • 2015-04-29
        • 1970-01-01
        • 2017-01-11
        • 1970-01-01
        • 2013-02-28
        • 2015-10-21
        • 2015-11-19
        • 1970-01-01
        • 2013-01-05
        相关资源
        最近更新 更多