¿Cómo se puede aplicar un file de parche creado con `git-log -p <nombre de file>` para crear todas las confirmaciones incluidas?

Antecedentes: esta pregunta . git apply <patchfile> solo recrea el file pero sin comprometer el historial, que en este caso sería deseable. ¿Hay algún cambio para git-apply para hacerlo? ¿O hay una forma de convertir el file de parche en un file compatible con git-am ? (Actualmente, git-am se queja "Falló la detección de formatting de parche")

Usted preguntó, entonces aquí está.

Usé este script, pero es bastante frágil. Trátelo como una inspiración, no como una solución razonable.

Extrae (date / autor / post de confirmación / parche) de la salida de git log -p , y luego ejecuta patch + git add + git apply para todos, en order inverso.

Probablemente haya alguna manera de calcular automáticamente el valor correcto de patch_level , pero no me molesté. Y apruebe el autor para git apply si no es todo usted.

 #!/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 } } 

mira en git quiltimport . Usted proporciona un directory donde el command encuentra un file llamado "serie". En este file, simplemente mencione los nombres de los files de parche, en order para que los aplique ". El text anterior al diff real en el file se utiliza como comentario de confirmación, el nombre de file (less el .patch) se usa como título, e intenta encontrar al autor en cada parche; si no encuentra ninguno, se lo solicitan.