ইতিমধ্যে প্রয়োগ করা কুনুদের উপেক্ষা করে কীভাবে প্যাচ তৈরি করবেন


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 এবং 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তা প্রত্যাখ্যান করা হয় যা ম্যানুয়ালি পরীক্ষা করা এবং মার্জ করা দরকার।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.