패치가 이미 적용된 친구들을 무시하도록 만드는 방법

패치가 이미 적용된 친구들을 무시하도록 만드는 방법

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

-N옵션은 내가 원하는 효과를 얻지 못했습니다. 이미 적용된 블록이 발견되면 거부 파일이 생성되고 해당 파일에 더 이상 블록이 적용되지 않습니다. 그 큰 덩어리를 무시하고 나머지 패치를 계속 적용하고 싶습니다. .rej 파일을 생성하고 싶은 유일한 경우는 블록을 적용할 수 없고 블록이 아직 적용되지 않은 것 같을 때입니다.

이를 수행할 수 있는 방법이 있습니까?

답변1

이렇게 하려면 patchutils를 설치해야 합니다.

이 스크립트는 큰 패치를 더 작은 개별 패치로 분할하며 각 패치에는 파일 블록만 포함됩니다. 그런 다음 이러한 패치를 사용하여 해당 패치를 적용할 수 있습니다 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 등의 파일로 채워집니다.

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거부되며 수동으로 검토하고 병합해야 합니다.

관련 정보