【问题标题】:Git apply skips patchesGit应用跳过补丁
【发布时间】:2017-07-12 04:58:32
【问题描述】:

我正在尝试应用包含带有git apply 的二进制文件的补丁,但只添加了文件。我尝试运行 git apply failing.patch -v 并打印出类似的内容:

跳过补丁“file.txt”。
正在检查补丁文件.bin...
干净地应用补丁文件.bin。

如何找出跳过的原因?由于当前的消息不是很具有启发性。

【问题讨论】:

  • 当补丁包含的更改已在过去应用时,通常会跳过该补丁。这有很多可能的原因:合并、挑选、手动操作更改或使用其他补丁等。
  • 我也想过,但事实并非如此。

标签: git patch


【解决方案1】:

我通过运行打印出的patch -p1 < failing.patch 发现了问题:

在输入第 5 行找不到要修补的文件

并提醒我我不在根目录中。

我不明白为什么no one had asked this before 以及为什么详细消息不详细。

此外,甚至official documentation 也没有提到跳过和可能的原因。

【讨论】:

  • 我遇到了同样的问题。尽管this reference 是 Drupal 特有的,但原因可以适用于任何地方——也就是说,如果存在任何错误,git 将不会应用补丁,而补丁命令以更零碎的方式工作。
  • 这个。令人惊讶的是,在这种情况下,git 的行为会因工作目录而异。移到仓库根目录后,补丁申请成功。
【解决方案2】:

如果你使用 --directory 选项来“git apply”:

--directory=<root>

该路径是相对于基本目录(包含“.git”的目录),而不是相对于当前工作目录。你也不能使用绝对路径。

这完全没有记录,我花了几个小时才发现。

【讨论】:

  • 至少应该提供一个错误以指示找不到目录,但我看到的只是一般的“跳过补丁”错误(并且仅在详细日志记录打开时)。
  • 哦,哇,谢谢。这也是我的问题。我没有使用正确的相对路径。确实应该从 git 那里得到一些关于正在发生的事情的更好的反馈。
【解决方案3】:

在尝试跨项目移植更改时遇到此问题。 git apply 似乎忽略了补丁文件路径上的任何目录名称,如果索引行与目标存储库中的文件哈希不匹配,它也会拒绝应用。我使用这些选项获得了更好的成功(其中--no-index 似乎没有记录):

git apply --verbose --no-index --directory {subdir} {patch-file} 

【讨论】:

    【解决方案4】:

    遇到同样的问题。在我的情况下,错误的来源是补丁目标的某些父目录中的.git 文件夹。解决方案是将补丁目标移到该父目录之外。

    【讨论】:

    • 添加到这个 - git 存储库内的补丁只能从 repo 的根目录应用,因此在 git 存储库的子目录中执行“git apply -v myPatch.patch”将跳过该补丁即使当文件放置在任何其他不包含在 repo 的目录中时,此命令也有效。另一种解决方法是从根目录调用“git apply -v path/to/myPatch.patch”,并确保补丁文件本身包含路径/to/fileToBePatched.file,该文件从根目录指向文件目录。
    • 我正在处理“忽略”文件夹中的生成项目。执行git init &lt;MY_FOLDER&gt; 允许应用补丁。
    【解决方案5】:

    我在这里根据其他答案提出了一个解决方案,但仍需进行一些研究。这篇文章与其他帖子相似,但填补了我从其他帖子中遗漏的部分。希望它可以节省一些时间。

    在我的例子中,与源 repo 相比,目标 repo 中有一个额外的目录级别。换句话说,源代码库中的顶级文件夹source-top-level 包含在目标代码库中的父代码库target-top-level 中。但是,由于没有错误,我不能确定这是问题所在。所以我使用了--verbose,它显示了错误,我可以确认确实是问题所在。

    然后我检查了 git 文档中的 --directory 选项。它允许您指定一个字符串,该字符串将附加到补丁中每个文件的路径:

    --directory=<root>
     Prepend <root> to all filenames.
    

    通过指定--directory=target-top-level,它将每个路径source-top-level/some-path 转换为target-top-level/source-top-level/some-path,这样git apply 就成功了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-21
      • 2012-02-02
      • 1970-01-01
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 2011-06-13
      • 2012-10-22
      相关资源
      最近更新 更多