J'ai finalement résolu cela en utilisant une solution similaire à celle de artyom.
Étape 1: Décomposez le patch en de nombreux patchs séparés, un pour chaque morceau.
J'ai utilisé ce script pour ce faire:
#!/usr/bin/python2
import sys
header = []
writing_header = False
patchnum = 0
patch = open(sys.argv[1], "r")
out = open("/dev/null", "w")
for line in patch.readlines():
if line.startswith("diff"):
header = []
writing_header = True
if line.startswith("@@"):
out.close()
out = open(str(patchnum) + ".diff", "w")
patchnum += 1
writing_header = False
out.writelines(header)
if writing_header:
header.append(line)
else:
out.write(line)
out.close()
Exemple d'utilisation:
$ cd directory_containing_patch
$ mkdir foo
$ cd foo
$ explode.py ../huge_patch.diff
Cela remplira le répertoire actuel avec des fichiers appelés 0.diff 1.diff et cetera.
Étape 2: appliquez chaque patch, en éliminant les patchs déjà appliqués.
J'ai utilisé ce script pour ce faire:
#!/bin/bash
if [[ $# -ne 1 || ! -d "${1}/" ]]; then
echo "Usage: $0 dirname"
exit 1
fi
find "$1" -name \*.diff | while read f; do
OUTPUT=$(patch -s -p1 -r- -i"$f")
if [ $? -eq 0 ]; then
rm "$f"
else
if echo "$OUTPUT" | grep -q "Reversed (or previously applied) patch detected!"; then
rm "$f"
fi
fi
done
Exemple d'utilisation:
$ cd directory_containing_code
$ apply_patches.bash directory_containing_patch/foo
Cela supprimera tous les correctifs générés précédemment qui s'appliquent correctement ou qui ont déjà été appliqués. Tous les correctifs qui restent foo
sont des rejets qui doivent être examinés et fusionnés manuellement.