使用git log -p创建的补丁文件如何应用?

10

我有一个补丁文件(所有补丁都适用于单个文件),是通过以下方式生成的:

git log -p file-of-interest.txt >patches.txt

现在我想将这些补丁应用于另一个仓库,但当我尝试时,出现了问题。
git am patches.txt

我收到了“补丁格式检测失败”的错误信息,即使使用git apply也不起作用。应该怎样正确地应用这些补丁呢?
编辑:我想做的是将两个提交之间单个文件中的所有更改提取为一组补丁,然后在另一个仓库中应用这些更改。使用“git log -p from..to -- the-file”可以生成差异。如果无法应用来自“git log”的补丁,是否可能让“format-patch”(或其他命令)仅为单个文件生成补丁?
4个回答

13
你需要将补丁拆分成单独的补丁。你可以从 git log -p 输出手动完成此操作,然后使用 git apply 按顺序应用它们。 git log -p 的输出实际上并不是为了让 git 处理而设计的...
但更好的选择是使用 git format-patch 为您创建一系列补丁文件(无需手动拆分),然后使用 git am 一次性应用它们所有...
git format-patch -o <output_directory> <from_revision>..<to_revision> -- file-of-interest.txt

还要注意,git am 需要电子邮件格式的补丁(例如由 git format-patch 生成的补丁),这就是为什么会出现 "Patch format detection failed" 的原因。使用 diffgit diff 生成的补丁应该使用 git apply 而不是 git am。但是,git format-patch / git am 工作流更加灵活并且通常更加健壮。


啊,format-patch 支持限制到一个文件。文档中没有提到这一点。 - erikkallen
@erikkallen 你说得对,这并没有被很好地记录。它在那里,但使用的术语有些模糊不清,比如“<common diff options>”和“在gitrevisions(7)的‘指定版本’部分查看”。 - twalberg
不是所有从git log获取的哈希值都是连续的。这样行得通吗? - yucer
如果补丁不是由我生成的怎么办?我收到了别人发送的补丁文件,但我不能重新创建它。 - Aaron Franke

1
如果您格式化从git log中得到的哈希值,并在路径号前面添加"-"符号,则所有补丁都可以一次性生成在不同的文件中。例如:
git format-patch $(git log --reverse 073dd505f..fff28ff65 --pretty="%H" -- the/needed/path | awk '{print -NR, " ", $0}')

这将涵盖您可以从git log中应用的所有过滤器。它们并不总是连续的提交。例如,获取与给定用户对应的补丁:

git format-patch $(git log --reverse --author="John Doe" --pretty="%H" -- the/needed/path | awk '{print -NR, " ", $0}')

使用--reverse选项可以按照时间顺序给出补丁,因为git log默认按照最新的先显示。


0

git log不能以那种方式生成补丁文件。使用git log查找要比较的提交号,然后使用git diff代替:

git diff 073dd505f fff28ff65 > changes.patch

0

您可以使用 git diff hash1...hash2 >a.patch 命令创建一个补丁文件,其中只包含 hash2 有但 hash1 没有的提交(请注意 3 个点 ...)。这相当于 git log -p hash1..hash2(请注意 2 个点 ..),但输出的格式可以用于实际修补文件。

更常见的 git diff hash1 hash2 >a.patch 命令将创建一个补丁文件,其中包含 hash1 和 hash2 之间的所有差异,包括 hash1 有但 hash2 没有的提交。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接