我有一个用
生成的补丁文件(所有补丁都适用于单个文件)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
(或其他命令)仅为单个文件生成补丁?
答案 0 :(得分:10)
您需要将补丁分解为单个补丁。您可以从git log -p
输出手动执行此操作,然后使用git apply
按顺序应用它们。 git log -p
输出并非真正用于git
处理...
但更好的选择是使用git format-patch
为您创建补丁文件序列(无需手动拆分),然后使用git am
一次性应用它们...... < / p>
git format-patch -o <output_directory> <from_revision>..<to_revision> -- file-of-interest.txt
另请注意,git am
需要使用电子邮件格式的补丁(例如git format-patch
生成的补丁,这就是“补丁格式检测失败”的原因)。使用diff
或git diff
生成的修补程序应使用git apply
,而非git am
。但git format-patch
/ git am
工作流程更灵活,通常更强大。
答案 1 :(得分:0)
git log不会以这种方式生成补丁文件。使用git log查找要比较的提交号,改为使用git diff:
git diff 073dd505f fff28ff65 > changes.patch
答案 2 :(得分:0)
如果您格式化由git log生成的哈希值,请在&#34; - &#34;之前添加路径号。符号然后可以在不同的文件中一次生成所有补丁。例如:
require 'rails_helper'
RSpec.describe "Comments", type: :request do
RSpec.shared_example "has nested comments" do
let(:path) { polymorphic_path(commentable) + "/comments" }
let(:params) { attributes_for(:comment) }
describe "POST create" do
expect do
xhr :post, path, params
end.to change(commentable.comments, :count).by(1)
end
end
context "Posts" do
include_examples "has nested comments" do
let(:commentable) { create(:post) }
end
end
context "Products" do
include_examples "has nested comments" do
let(:commentable) { create(:product) }
end
end
end
这将涵盖您可以从git log应用的所有过滤器。他们并非总是连续提交。例如,获取与给定用户相对应的补丁:
git format-patch $(git log --reverse 073dd505f..fff28ff65 --pretty="%H" -- the/needed/path | awk '{print -NR, " ", $0}')
需要使用--reverse选项按时间顺序为你提供补丁,因为git log首先给出了最多的补丁。
答案 3 :(得分:0)
您可以使用git diff hash1...hash2 >a.patch
来创建仅hash2不具有hash1的提交的补丁文件(注意3个点...
)。这将等效于git log -p hash1..hash2
(请注意两个点..
),但是输出将采用您实际可以用来修补文件的格式。
更常见的git diff hash1 hash2 >a.patch
将创建一个补丁文件,其中包含hash1和hash2之间的所有差异,包括hash1拥有但hash2没有的提交。