背景:この質問. git apply <patchfile>
ファイルを再作成するだけですが、履歴をコミットすることはありません。この場合、これは望ましいことです。git-apply
そうするためのスイッチはありますか?git-am
または、パッチファイルを互換性のあるファイルに変換する方法はありますか? (現在、git-am は「パッチ形式の検出に失敗しました」と不平を言っています)
質問する
814 次
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 に答える