使用 Windows 版 Git 的 patch.exe 时出现“断言失败”

Use*_*ser 2 windows patch batch-file

我有一个目录包含几个要修改的文件。我没有手动进行更改(因为文件太多),而是下载了一个 diff 文件(由其他用户制作),这个 diff 文件由 .bat 文件执行。

让我让它更系统。

  1. bat文件是WinDDK_7600.16385.1_patch.bat这个文件的路径是( C:\Users\kunze\Documents\Visual Studio 2010\Projects\busmaster-master\Documents\1 Development Environment\files)

这个文件的内容是

@echo on

set PATH=%PATH%;%ProgramFiles%\Git\bin

patch -p1 -d C:/ < WinDDK_7600.16385.1.diff

pause
Run Code Online (Sandbox Code Playgroud)
  1. 当我运行 bat 文件时,它将运行,WinDDK_7600.16385.1.diff并且此差异文件对 .bat 中的许多文件进行了更改C:\WinDDK。这个文件的路径是C:\Users\kunze\Documents\Visual Studio 2010\Projects\busmaster-master\Documents\1 Development Environment\files

  2. 需要更新差异的文件位于此目录中 C:\WinDDK

  3. 我已经为 git/bin 设置了路径环境变量

  4. 有人可以让我知道我应该在我的WinDDK_7600.16385.1_patch.bat 文件中进行哪些更改, 以便它可以找到并更新位于C:\WinDDK目录中的所有文件

我试了好几次,每次都出现这个错误"Assertion failed: hunk, file ../patch-2.5.9-src/patch.c, line 354"?有什么问题吗?

kos*_*tix 6

.diff文件、patch工具及其与 Git 的相关性

首先,这个问题与Git无关。Git for Windows,你应该已经安装在你的计算机上,只是碰巧附带了 Windows 端口patch-一个应用特殊格式文件描述的更改的程序。具体来说,GfW 包括GNU 补丁程序。

patch.exeGfW 提供的程序位于%ProgramFiles%\Git\bin(除非您覆盖了安装位置)。

.diff文件包含什么以及如何patch工作

补丁文件格式

引用上面链接的维基百科文章,差异文件如下所示:

--- /path/to/original   ''timestamp''
+++ /path/to/new    ''timestamp''
@@ -1,3 +1,9 @@
+This is an important
+notice! It should
+therefore be located at
+the beginning of this
+document!
+
 This part of the
 document has stayed the
 same from version to
@@ -5,16 +11,10 @@
 be shown if it doesn't
 change.  Otherwise, that
 would not be helping to
-compress the size of the
-changes.
-
-This paragraph contains
-text that is outdated.
-It will be deleted in the
-near future.
+compress anything.

 It is important to spell
-check this dokument. On
+check this document. On
 the other hand, a
 misspelled word isn't
 the end of the world.
Run Code Online (Sandbox Code Playgroud)

这是我们在这里的内容:

  • 首先是标题的两行,当基于它们生成 diff 文件时,它们描述了哪个文件是原始文件,哪个是“新”文件——区别在于“新”文件与“原始”文件相比。
  • @@ ... @@块划“帅哥”,描述那里的原始文件通过这个大块头的一块变化所在,它最初多少行包含,它会多少打补丁后包含的内容。

    关于大块的下一个(也是最重要的)事情是改变标志:+分别表示添加的行,-表示已删除线,而前缀线(单个空格字符)不改变,并提供上下文patch工具,能够执行“模糊匹配” ——不仅基于行数,还基于实际文件内容。

patch工具的工作原理

patch工具获取.diff文件并

  1. 读取它直到第一个标头,解析标头,提取文件的名称以从中修补。
  2. 在目标目录中定位具有在步骤 (1)获得的名称的文件
  3. 读取第一个大块,在它找到的文件中定位它,并应用大块中的补丁。

    如果修补大块失败,则patch创建一个特殊的“拒绝”文件(通过组合它尝试修补的文件的尾名加上.rej扩展名)并将失败的大块写入那里。

  4. 转到下一个大块并重复,直到找到新标头的补丁文件末尾。

    如果找到下一个头,则重复从(2)开始的步骤,否则退出。

patch工具如何定位要修补的文件

大多数情况下,补丁文件中的标头包含相对路径名(如foo/bar/baz.c),该patch工具如下所示:

  1. 从标题中提取该名称。
  2. 获取工具的当前目录并将该路径名附加到其上以获取要修补的文件的名称。

两个命令行选项会影响patch工具的行为:

  • -d <dir>选项告诉它<dir>在执行工作之前将其当前目录更改为。
  • -p N选项告诉它N在进一步考虑之前从头中提取的路径名中修剪路径组件。

    这意味着-p1通过传递给它,patch将在尝试定位该文件之前转换foo/bar/baz.cbar/baz.c

到现在为止,您应该能够完全理解您的批处理文件的作用,我要求您解决这个问题,不要再考虑所有这些黑巫毒。

patch工具中的“断言失败”错误

我的猜测是您遇到了一个不幸的错误,该错误偶尔会出现在各种 Windows 端口中——EOL 标记的patch问题:该工具只是在+序列上窒息。CRLF

解决此问题的可能方法:

  • git apply按照此处的说明进行尝试——Git 不使用patch.exe而是使用它自己的机器,GfW 搬运工教它可以与 Windows EOL 正常工作。
  • 尝试其他端口patch,例如来自 GnuWin32 项目的这个端口。

    请注意,您可能会遇到一些 UAC 问题;是修复它的方法。