首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何应用使用``git log -p <filename>`创建的补丁文件来创建包含的所有提交?

如何应用使用``git log -p <filename>`创建的补丁文件来创建包含的所有提交?
EN

Stack Overflow用户
提问于 2010-07-07 19:28:53
回答 2查看 810关注 0票数 0

背景:this questiongit apply <patchfile>只是重新创建文件,而不提交历史记录,这在本例中是可取的。git-apply有什么开关可以做到这一点吗?或者,有没有办法将补丁文件转换为git-am兼容文件?(目前,git-am会报错"Patch format detection“)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-07-10 01:32:21

你问过了,所以就是这样。

我使用了这个脚本,但它非常脆弱。把它当作一种灵感,而不是一个合理的解决方案。

它从git log -p的输出中提取(日期/作者/提交消息/补丁),然后以相反的顺序为所有人运行patch+git add+git apply

可能有一些方法可以自动找出正确的patch_level,但我并没有费心。如果不是你,就把author传给git apply

代码语言:javascript
运行
复制
#!/usr/bin/env ruby

class String
  def shell_escape
    if empty?
      "''"
    elsif %r{\A[0-9A-Za-z+,./:=@_-]+\z} =~ self
      self
    else
      result = ''
      scan(/('+)|[^']+/) {
        if $1
          result << %q{\'} * $1.length
        else
          result << "'#{$&}'"
        end
      }
      result
    end
  end
end

dir1, dir2, *files = ARGV

patchlog = Dir.chdir(dir1){`git log -p #{files.map(&:shell_escape).join(" ")}`}

patches = []
patchlog.each_line{|line|
  if line =~ /\Acommit/
    patches << {}
  elsif line =~ /\A(Author|Date):\s*(.*)/
    patches[-1][$1] = $2
  elsif patches[-1][:diff].nil? and line !~ /\Adiff/
    (patches[-1][:msg] ||= "") << line
  else
    (patches[-1][:diff] ||= "") << line
  end
}

patch_level = 2
skip = 0
dry_run = false

patches.reverse[skip..-1].each{|patch|
  author = patch["Author"].strip
  date = patch["Date"].strip
  msg = patch[:msg].strip
  diff = patch[:diff]

  if dry_run
    puts ["git", "commit", "-m", msg, "--date", date].join(" ")
    next
  end

  Dir.chdir(dir2){
    IO.popen("patch -p#{patch_level}", "w"){|fh|
      fh.puts diff
    }
    system "git", "add", *files
    system "git", "commit", "-m", msg, "--date", date
  }
}
票数 1
EN

Stack Overflow用户

发布于 2011-09-06 21:58:27

调查一下git quiltimport。您提供了一个目录,该命令在该目录中查找名为"series“的文件。在这个文件中,你只需简单地提到补丁文件的名称,按照它应用它们的顺序。文件中实际差异之前的文本被用作提交注释,文件名(减去.patch)被用作标题,并且它试图在每个补丁中找到作者,如果没有找到,就会要求你提供它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3194240

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档