मैंने आखिरकार आर्टीज के समान एक समाधान का उपयोग करके इसे हल किया।
चरण 1: पैच को अलग-अलग पैच में से प्रत्येक में एक के लिए एक विस्फोट करें।
मैंने यह करने के लिए इस स्क्रिप्ट का उपयोग किया:
#!/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()
उदाहरण उपयोग:
$ cd directory_containing_patch
$ mkdir foo
$ cd foo
$ explode.py ../huge_patch.diff
यह वर्तमान निर्देशिका को 0.diff 1.diff et cetera नामक फ़ाइलों के साथ पॉप्युलेट करेगा।
चरण 2: प्रत्येक पैच को लागू करें, पहले से ही लागू पैच को त्याग दें।
मैंने यह करने के लिए इस स्क्रिप्ट का उपयोग किया:
#!/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
उदाहरण उपयोग:
$ cd directory_containing_code
$ apply_patches.bash directory_containing_patch/foo
यह पहले से जेनरेट किए गए पैच में से कोई भी हटा देगा जो सफाई से लागू होता है या जो पहले ही लागू हो चुका है। छोड़े गए किसी भी पैच foo
को अस्वीकार कर दिया जाता है जिसे मैन्युअल रूप से जांचने और विलय करने की आवश्यकता होती है।