Как я могу «возобновить» обработчик после слияния, который был прерван из-за конфликтов слияния? - PullRequest
0 голосов
/ 16 октября 2019

У меня есть post-merge git hook, который частично основан на https://gist.github.com/sindresorhus/7996717. Как и ожидалось, ловушка не запускается, если вытягивание вызывает конфликты слияния.

Как мне поступить с обработкойконфликты слияния, так что мой крюк может работать как нужно? Мой крючок зависит от различий. Если я вручную разрешаю конфликты и фиксирую обновления, у меня больше нет различий, поэтому логика в моем хуке больше не актуальна.

вот хук (хотя я думаю, что на самом деле не имеет значения, что находится вздесь, если есть конфликты для начала)

#!/bin/sh
echo "[post-merge] Commit done."
DIFFS="$(git diff-tree -r --name-only --no-commit-id HEAD@{1} HEAD)"
BLUE='\033[0;34m'
GRN='\033[0;32m'
NC='\033[0m' # No Color
# Git hooks are not designed to be interactive. By default they don't have access to $stdin. 
# which meant that normal use of `read` was not working when used within the context of a git hook.
# This line restores keyboard access to stdin so that the dev can respond to the prompt that appears while the hook
# is running.
# Alternatively, we could forgo the confirmation and make package installation automatic, 
# though it seems better to allow dev to decide.

exec < /dev/tty

check_incoming() {
    # $1 is package.json 
    # $2 is handle_package_json
    echo "$DIFFS" | grep --quiet "$1" && eval "$2"
    exit 0
}

handle_package_json() {
    while true; do
    echo -e "${BLUE}[post-merge] PACKAGE.JSON UPDATED:${NC}"
    read -p "[post-merge] File may contain dependency updates. Run yarn install? (y/n) " yn
    if [ "$yn" = "" ]; then
        yn='Y'
    fi
    case $yn in
        [Yy] ) yarn install; break;;
        [Nn] ) echo "[post-merge] Installation deferred. You may need to manually update dependencies at a later point."; exit;;
        * ) echo "[post-merge] Please answer y or n for yes or no.";;
    esac
    done
}

if [[ -n "$DIFFS" ]]; then
    check_incoming package.json handle_package_json;    
fi

1 Ответ

0 голосов
/ 16 октября 2019

Как мне поступить с обработкой конфликтов слияния, чтобы мой хук мог работать как нужно?

Вы не можете сделать это из хука, потому что - как вы обнаружили - хук никогда

Вам нужно, чтобы пользователи вызывали вашу собственную команду вместо , работающую git merge. Выполните команду git merge и проверьте результат (включая состояние выхода), чтобы определить, удалось ли объединение.

(обратите внимание, что это означает, что они также не могут запустить git pull, поскольку git pull запускает git fetchзатем git merge. Возможно, вам потребуется предоставить им команду для замены git pull, если они относятся к категории людей, которым нравится команда git pull.)

(В качестве отступления,кажется, что имеет смысл проверить, может ли package.json потребоваться объединение до того, как начнет работу с git merge: найдите базу слияния самостоятельно и используйте git rev-parse для извлечения трех хеш-идентификаторов, для HEAD:package.json, <merge-base>:package.json и <theirs>:package.json. Если совпадающие хэш-идентификаторы не совпадают, вы можете даже извлечь сами файлы, с помощью git show или git cat-file -p, чтобы выполнить проверки перед объединением, если это необходимо. три хеш-идентификатора совпадают, слияние тривиально: все три файла одинаковы, и Git будет сохранять package.json как есть. Если база слияния и их совпадают, но HEAD отличается, Git сохранит версию HEAD. Если базы слияния и HEAD совпадают, но они различаютсяs, Git примет их версию. Если все три не не совпадают, Git попытается объединить данные json, как если бы они были текстовым ориентированным на строки, что, вероятно, приведет к бессмысленности.)

...