Düzeltme eki uygulanmış iri parçaların yoksayılması


14

Koduma uygulamaya çalıştığım çok büyük bir yama dosyası var. Sorun şu ki, düzeltme ekimdeki bazı değişiklikler kodda zaten var. Düzeltme ekini uygulanmış olan değişiklikleri dikkatlice yok saymanın bir yolu var mı?

-NSeçenek istediğimi yapmıyor. Önceden uygulanmış bir yığınla karşılaşırsa, bir reddetme dosyası oluşturur ve bu dosyaya daha fazla yığın uygulanmaz. Sadece o iri parçayı görmezden gelmesini ve yamanın kalanını uygulamaya devam etmesini istiyorum. Bir .rej dosyası oluşturmasını istediğim tek zaman, bir yığın uygulanamaz ve zaten uygulanmış gibi görünmüyor.

Bunu yapmanın bir yolu var mı?

Yanıtlar:


7

Bunun için patchutils'e ihtiyacınız olacak.

Bu komut dosyası, büyük bir düzeltme ekini daha küçük ayrı önbelleklere böler; her birinde bir dosya için yalnızca tek bir yığın bulunur. Daha sonra bu yamaları ile uygulayabilirsiniz 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

Düzenleme : komut dosyasını buraya kaydedin hunks.shve çağırın:

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

2

Sonunda bunu artyom'lara benzer bir çözüm kullanarak çözdüm.

Adım 1: Yamayı, her bir iri parça için bir tane olmak üzere birçok ayrı yamaya patlatın.

Bunu yapmak için bu komut dosyasını kullandım:

#!/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()

Örnek kullanım:

$ cd directory_containing_patch
$ mkdir foo
$ cd foo
$ explode.py ../huge_patch.diff

Bu işlem geçerli dizini 0.diff 1.diff et cetera adlı dosyalarla doldurur.

Adım 2: Önceden uygulanmış yamaları atarak her bir yamayı uygulayın.

Bunu yapmak için bu komut dosyasını kullandım:

#!/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

Örnek kullanım:

$ cd directory_containing_code
$ apply_patches.bash directory_containing_patch/foo

Bu, daha önce temizlenmiş ya da daha önce uygulanmış olan yamaları siler. İçinde kalan yamalar foo, manuel olarak incelenmesi ve birleştirilmesi gereken reddetmelerdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.