背景:这个问题。git apply <patchfile>
只是重新创建文件但不提交历史记录,在这种情况下这是可取的。有什么开关git-apply
可以这样做吗?或者有没有办法将补丁文件转换为git-am
兼容文件?(目前,git-am 报错“补丁格式检测失败”)
2 回答
1
你问了,所以就在这里。
我使用了这个脚本,但它都很脆弱。将其视为灵感,而不是合理的解决方案。
它从 的输出中提取(日期/作者/提交消息/补丁),git log -p
然后以相反的顺序为所有人运行patch
++ 。git add
git apply
可能有某种方法可以自动找出正确的patch_level
,但我没有打扰。git apply
如果不是全部,请将作者传递给您。
#!/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
}
}
于 2010-07-09T17:32:20.567 回答
1
调查git quiltimport
。您提供一个目录,该命令可以在其中找到一个名为“series”的文件。在此文件中,您只需提及补丁文件的名称,以便它将应用它们”。文件中实际差异之前的文本用作提交注释,文件名(减去 .patch)用作标题,它会尝试在每个补丁中找到作者,如果没有找到,你会被要求提供。
于 2011-09-06T13:58:27.247 回答