8

我有一个补丁文件(所有这些都适用于单个文件)

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

4 回答 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,这就是您收到“补丁格式检测失败”的原因)。生成的补丁程序diffgit diff应该应用程序git apply,而不是git am。但是git format-patch/git am工作流更灵活,通常更健壮。

于 2013-01-29T21:39:57.500 回答
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 首先给出最新的。

于 2016-05-16T14:57:58.413 回答
0

git log 不会以这种方式生成补丁文件。使用 git log 找出您想要比较的提交编号并使用 git diff 代替:

git diff 073dd505f fff28ff65 > changes.patch
于 2013-01-29T21:43:37.313 回答
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 没有的提交。

于 2019-10-09T20:33:49.227 回答