如何使补丁忽略已应用的帅哥

Shu*_*hum 16 patch

我有一个非常大的补丁文件,我正试图将其应用到我的代码中。问题是,我的补丁中的一些更改已经存在于代码中。有没有办法让补丁优雅地忽略已经应用的更改?

-N选项不符合我的要求。如果它遇到一个已经应用的大块,它将生成一个拒绝文件,并且不会再向该文件应用任何大块。我希望它忽略那个大块头并继续应用补丁的其余部分。我希望它生成 .rej 文件的唯一时间是无法应用大块头并且似乎尚未应用。

有没有办法做到这一点?

小智 7

为此,您需要安装 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
Run Code Online (Sandbox Code Playgroud)

编辑:将脚本保存到hunks.sh,并调用它:

./hunks.sh path/to/big.diff path/to/output/directory
Run Code Online (Sandbox Code Playgroud)