코드에 적용하려는 패치 파일이 매우 큽니다. 문제는 패치의 일부 변경 사항이 이미 코드에 존재한다는 것입니다. 패치가 이미 적용된 변경 사항을 정상적으로 무시하도록하는 방법이 있습니까?
-N
옵션은 내가 원하는 걸하지 않습니다. 이미 적용된 덩어리를 발견하면 거부 파일을 생성하고 해당 파일에 더 이상 덩어리를 적용하지 않습니다. 나는 그 덩어리를 무시하고 나머지 패치를 계속 적용하기를 원합니다. .rej 파일을 생성하려는 유일한 시간은 덩어리를 적용 할 수없고 이미 적용된 것으로 보이지 않는 경우입니다.
이것을 할 수있는 방법이 있습니까?
답변
이를 위해 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
답변
결국 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
수동으로 검사하고 병합해야하는 거부입니다.