पैच को कैसे अनदेखा करें, पहले से लागू हॉक


14

मेरे पास एक बहुत बड़ी पैच फ़ाइल है जिसे मैं अपने कोड पर लागू करने की कोशिश कर रहा हूं। समस्या यह है, मेरे पैच में कुछ बदलाव कोड में पहले से मौजूद हैं। क्या पैच को पहले से लागू किए गए परिवर्तनों को सावधानीपूर्वक अनदेखा करने का एक तरीका है?

-Nविकल्प जो मैं चाहता भी नहीं करता है। यदि यह पहले से ही लागू हंक का सामना करता है तो यह एक रिजेक्ट फाइल उत्पन्न करेगा और उस फाइल पर कोई अधिक हंक लागू नहीं करेगा। मैं चाहता हूं कि यह सिर्फ उस हंक को नजरअंदाज करे और बाकी पैच अप्लाई करता रहे। केवल एक बार जब मैं चाहता हूं कि एक .rej फ़ाइल जनरेट की जाए तो एक हंक लागू नहीं किया जा सकता है और पहले से ही लागू नहीं होता है।

क्या इसे करने का कोई तरीका है?

जवाबों:


7

इसके लिए आपको पैचअपलेट स्थापित करने होंगे।

यह स्क्रिप्ट एक बड़े पैच को छोटे-छोटे अलग-अलग हिस्सों में विभाजित करेगी, उनमें से प्रत्येक में एक फ़ाइल के लिए केवल एक हंक होगा। इसके बाद आप इन पैच को लगा सकते हैं patch --forward

#!/bin/sh -eu

PATCH=$1
OUTDIR=$2

test -f "$PATCH" && test -d "$OUTDIR"

TDIR=$(mktemp -d)
trap 'rm -rf $TDIR' 0

INDEX=0
TEMPHUNK=$TDIR/current_hunk

lsdiff $1 | while read FNAME
do
    HUNK=1
    while :
    do
        filterdiff --annotate --hunks=$HUNK -i "$FNAME" "$PATCH" > "$TEMPHUNK"
        HUNK=$((HUNK+1))
        test -s "$TEMPHUNK" && \
            {
                mv "$TEMPHUNK" "$OUTDIR/$INDEX.diff"
                INDEX=$((INDEX+1))
            } || break
    done
done

संपादित करें : स्क्रिप्ट को इसमें सहेजें hunks.shऔर कॉल करें:

./hunks.sh path/to/big.diff path/to/output/directory

2

मैंने आखिरकार आर्टीज के समान एक समाधान का उपयोग करके इसे हल किया।

चरण 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को अस्वीकार कर दिया जाता है जिसे मैन्युअल रूप से जांचने और विलय करने की आवश्यकता होती है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.