应用使用git log -p创建的补丁

时间:2013-01-29 20:44:04

标签: git patch

我有一个用

生成的补丁文件(所有补丁都适用于单个文件)
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 个答案:

答案 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生成的补丁,这就是“补丁格式检测失败”的原因)。使用diffgit 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没有的提交。