패치가 이미 적용된 덩어리를 무시하게하는 방법


14

코드에 적용하려는 패치 파일이 매우 큽니다. 문제는 패치의 일부 변경 사항이 이미 코드에 존재한다는 것입니다. 패치가 이미 적용된 변경 사항을 정상적으로 무시하도록하는 방법이 있습니까?

-N옵션은 내가 원하는 걸하지 않습니다. 이미 적용된 덩어리를 발견하면 거부 파일을 생성하고 해당 파일에 더 이상 덩어리를 적용하지 않습니다. 나는 그 덩어리를 무시하고 나머지 패치를 계속 적용하기를 원합니다. .rej 파일을 생성하려는 유일한 시간은 덩어리를 적용 할 수없고 이미 적용된 것으로 보이지 않는 경우입니다.

이것을 할 수있는 방법이 있습니까?

답변:


7

이를 위해 patchutils가 설치되어 있어야합니다.

이 스크립트는 하나의 큰 패치를 더 작은 별도의 paches로 나누며, 각 패치는 하나의 파일에 하나의 덩어리 만 포함합니다. 그런 다음이 패치를로 적용 할 수 있습니다 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

결국 artyom과 비슷한 솔루션을 사용 하여이 문제를 해결했습니다.

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 etceter라는 파일로 채 웁니다.

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.