Может ли git Server Hook обнаруживать, когда конфликт разрешается? - PullRequest
0 голосов
/ 16 октября 2018

Я хотел бы предпринять действия на стороне сервера, когда любой коммит слияния, который разрешает конфликт, отправляется на сервер.В частности, я хотел бы уведомить других авторов о проверке слияния, чтобы убедиться, что их работа не затронута, поэтому мне интересно, есть ли способ, с помощью которого серверная часть git (pre-receive или post-receive) может оба обнаруживают, что фиксация является слиянием , а знает, какая строка содержит разрешенные конфликты?(таким образом, он может git blame более раннюю версию и найти авторов для уведомления)

1 Ответ

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

Обнаружить, что коммит является коммитом слияния, легко: у него более одного родителя.

Обнаружить, что коммит является результатом слияния код , вообще невозможно, так кактакие коммиты никак не отмечены.Cherry-выбранные и отмененные коммиты являются выходами кода слияния, и они иногда помечаются как таковые в своих сообщениях коммитов;но это только особые случаи.Используя git merge --squash, любой может вызвать процесс слияния как глагол, но сделать обычный коммит без слияния.Можно создать правило политики, согласно которому коммиттеры должны отмечать свои конфликты, но их нелегко применять.Git раньше записывал их как часть своего сообщения о фиксации по умолчанию, и до сих пор делает это в некоторой степени, но они обычно закомментированы.

В любом случае, если вы удовлетворены обнаружением фиксации слиянияс помощью метода «более одного родителя» (т.е. игнорируя сквош-слияние и другие особые случаи) все еще сложно перейти от «это слияние» к «это слияние, которое имело некоторые конфликты». можно механически выяснить, что были конфликты: просто повторно выполнить слияние, используя отсоединенную головку, для каждого коммита, который был коммитом слияния.На этом этапе также возможно сравнить результат слияния, если Git может слить его самостоятельно, с результатом слияния: просто используйте git diff-tree, чтобы сравнить деревья двух коммитов.Следовательно:

if (commit $H is a merge):
    get list of all of $H parents
    git checkout $list[0]  # assuming a zero subscript means first
    git merge --quiet $list[1:N-1]
    if (last command succeeded):
        difference=$(git diff-tree -r HEAD $H)
        if (no difference):
            commit was entirely mechanical
        else:
            commit is suspicious
    else:
        commit has conflicts
        git reset --hard HEAD # discard work-tree

(Этот процесс должен быть запущен в хранилище с рабочим деревом или с использованием временного рабочего дерева через git --work-tree=<path>.)

Если слияние имеетконфликты, обнаружение конфликтующих строк и обнаружение автора будут хитрыми.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...