Как заставить патч уже проигнорировать примененную скрягу

Я так и не смог загрузить сервер, ни был кем-либо еще на сайте, кто знает что-либо о Linux. Мы восстановили установку и приняли значения по умолчанию CentOS, обеспеченный после выбора опции 'Use all Space'. По-видимому, установка Ваших собственных разделов работала. Я установил разделы сотни времени в других системах без проблем, но этой установке CentOS не нравилось это. Не уверенный, если кто-либо еще столкнулся с этим или не, но это - что-то, чтобы рассмотреть, сталкивается ли кто-либо еще с той же проблемой при выполнении установки путем, я сделал.

14
22.02.2013, 05:42
2 ответа

Вам будет нужен 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
7
27.01.2020, 19:52

Я в конечном счете решил это использование решения, подобного artyom's.

Шаг 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 отклонения, которые должны быть вручную исследованы и объединены.

2
27.01.2020, 19:52

Теги

Похожие вопросы