【问题标题】:Applying a diff file with git使用 git 应用差异文件
【发布时间】:2013-04-02 18:45:23
【问题描述】:

所以我试图使用将差异文件应用到我的 git dev 分支。我想应用的差异是这里的:https://github.com/mbabker/joomla-cms/compare/JHtml_move.patch

我用git apply PATH_TO_PATCH.patch

现在在尝试应用它时,我得到了大量的错误,并累积了

fatal: git apply: bad git-diff - expected /dev/null on line 47

事情是第 47 行读取 --- /dev/null

我在另一个论坛上看到有人说/dev/null 部分后面有一个尾随空格,但没有。

如果有任何帮助,我也会在第 9、10、11、12 和 13 行出现尾随空格的错误 - 尽管它们不是任何尾随空格。

无论如何,差异是由 git 生成的 - 我只是将其复制并粘贴到记事本中。

我也尝试过使用curl https://github.com/mbabker/joomla-cms/compare/JHtml_move.patch | git am,但这只会给出错误而没有指定位置。

关于为什么当线路实际存在时它会给出致命错误的任何想法????


更新到@IvanZuzak 我尝试添加git am --ignore-space-change --ignore-whitespace PATH_TO_PATCH.patch 但首先我得到了(因为这是下载的补丁)一个错误说电子邮件无效(它已被转换为html代码)所以我试图修复它但它一直抛出它时不时地。然后它说previous rebase directory PATH_TO_GITHUB_BRANCH/.git/rebase-apply still exists but mbox given.。所以我发现this 建议删除分支.git 文件夹中的rebase-apply 文件夹。所以我这样做了,然后我又收到了无效的电子邮件错误(尽管我已经将这两个都改成了 html 格式)

【问题讨论】:

  • 复制/粘贴?记事本?严肃的?我敢打赌,DOS换行符是问题所在。尝试正确复制补丁文件。
  • 好吧,我首先尝试使用 curl 失败了 - 但是当失败时是记事本。那我该如何复制补丁文件呢?
  • 只需将其保存为浏览器中的文件? CTRL+s 是保存当前打开网页的常用键盘快捷键。另外,当 curl 组合失败时,您会遇到什么错误?
  • @IvanZuzak 添加了带有 curl 错误的屏幕截图。补丁移动以删除那里提到的两个文件。它们肯定存在于 git 项目中。我尝试从浏览器中保存,但它试图删除的所有其他文件以类似的方式出现了更多错误。
  • @GeorgeWilson 你能试试git am --ignore-space-change --ignore-whitespace PATH_TO_PATCH.patch 看看是否有效吗?另外,请注意使用git amgit apply 之间存在差异,使用https://github.com/mbabker/joomla-cms/compare/JHtml_move.patchhttps://github.com/mbabker/joomla-cms/compare/JHtml_move.diff 之间也存在差异(注意补丁与差异文件扩展名)。 git am 适用于 .patch 文件,而 git apply 适用于 .diff(至少应该如此)。

标签: git github


【解决方案1】:

您必须检查在 Git 2.17(2018 年第二季度)之后是否仍然看到错误消息 bad git-diff - expected /dev/null on line 47

git apply”中的许多地方都知道“/dev/null”表示“在 diff 的这一侧没有这样的文件”在解析补丁时可以后面跟空格和垃圾,除了一个,它拒绝了其他有效的补丁(例如来自颠覆的补丁)。

commit e454ad4(2018 年 2 月 15 日)Tatyana Krasnukha (tkrasnukha)
请参阅 Johannes Schindelin (dscho)commit f16ef7b(2018 年 2 月 15 日)。
(由 Junio C Hamano -- gitster -- 合并于 commit 177bd65,2018 年 2 月 28 日)

另见git-for-windows/git issue 1489

apply:用/dev/null优雅地处理Subversion差异

Subversion 生成的差异可以包含这样的行:

--- /dev/null(不存在)

让我们教 Git 的应用机器优雅地处理这样一行。

【讨论】:

    【解决方案2】:

    我遇到了同样的问题。

    fatal: git apply: bad git-diff - expected /dev/null on line 96

    或者,如果我将所有行尾转换为 Unix 格式:

    error: patch failed: <file>:81
    error: <file>: patch does not apply
    ...
    

    git apply --ignore-whitespace &lt;patch&gt;.patch 使用 Unix 换行符。

    【讨论】:

      【解决方案3】:

      我遇到了同样的问题,但我正在测试一个我要发送到列表服务器的补丁,遵循这里的建议:https://www.kernel.org/doc/Documentation/email-clients.txt。我不能只解决本地文件的问题,我需要分发一个可能会被 gmail 破坏的补丁,并且我正在使用 git apply 检查 gmail 版本。

      我的同事向我指出

      git am 
      

      在纠正这类问题方面比git apply 更好,并且应该与.patch 文件一起使用。上面的其中一个 cmets 中提到了这一点,但它应该是一个答案。

      【讨论】:

      • git am 文档说它从邮箱应用补丁...你如何将它与 .patch 文件一起使用?
      • git am 0001-example.patch - 我不确定我是否理解这个问题。
      【解决方案4】:

      我有同样的问题。我打开了 Git Bash(Cygwin 也可以)并做了:

      dos2unix.exe <patch-file>
      

      然后我就可以完美地应用补丁了。

      【讨论】:

        【解决方案5】:

        我也遇到了同样的问题:

        fatal: git apply: bad git-diff - expected /dev/null on line 47
        

        但第 47 行显示为 --- /dev/null。我发现的问题是行尾是 Windows 格式而不是 UNIX 格式。在 Notepad++ 中将行尾转换为 UNIX 格式解决了我的问题。

        【讨论】:

        • 这里相同,除了我无法从 Edit>LineEndings 转换(它说我已经是 Unix 格式)。我必须在高级替换提示中查找/替换 \r\n 到 \n。
        • 这也是我的问题。要在 Vim 中转换行尾,打开文件,运行命令:set filetype=unix,然后写入文件并关闭。完成后,补丁成功为我申请了
        • 我在 Ubuntu 上也遇到了行尾问题。我使用 apt-get install dos2unix 安装了 dos2unix,它就像一个魅力。
        • 我也有这个问题,dos2unix 没有解决。我运行了“svn diff --git”,它已将删除模式设置为 10644,这是无效的。我需要将其更改为 100644。
        • @NathanWallace :set filetype=unix 对我不起作用,我不得不使用 :set ff=unix
        【解决方案6】:

        我遇到了同样的问题 你有一个 rebase 正在进行中,写

        git rebase --skip 
        

        很多次,直到看到No rebase in progress? 然后用git am重试

        【讨论】:

          猜你喜欢
          • 2018-10-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-11-11
          • 1970-01-01
          相关资源
          最近更新 更多