「git -log -p 」で作成されたpatchfileをどのように適用して、含まれているすべてのコミットを作成できますか?
質問
バックグラウンド: この質問. git apply <patchfile>
ファイルを再作成するだけでなく、履歴をコミットすることなく、この場合は望ましいものになります。のスイッチはありますか git-apply
そうするために?または、パッチファイルをに変換する方法がありますか git-am
互換性のあるファイル? (現在、Git-AMは「パッチ形式の検出が失敗した」と不満を述べています)
解決
あなたは尋ねたので、ここにそうです。
私はこのスクリプトを使用しましたが、それはすべてかなり壊れやすいです。合理的な解決策としてではなく、それをインスピレーションとして扱います。
の出力から抽出(日付 /著者 /コミットメッセージ /パッチ) 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
}
}
他のヒント
調べてください git quiltimport
. 。コマンドが「シリーズ」というファイルを見つけるディレクトリを提供します。このファイルでは、パッチファイルの名前を適用する順にパッチファイルの名前に言及しているだけです。ファイル内のactuall diffの前のテキストはコミットコメントとして使用されます。そして、それは各パッチで著者を見つけようとしますが、いない場合は、あなたがそれを求められます。
所属していません StackOverflow