Подтвердить что ты не робот

Git rerere не выполняет автоматическое согласование разрешенных слияний

Я пытаюсь использовать общий кеш rerere для автоматизации отложенных интеграционных/тестовых ветвей.

Идея заключается в том, что кеш-ререйер должен быть обновлен, когда ветвь будет нажата, чтобы эти слияния всегда проходили. Однако они не делают:

>>> git merge --no-ff invoicing
Staged 'analysisrequest.py' using previous resolution.
Staged '__init__.py' using previous resolution.
Auto-merging __init__.py
CONFLICT (content): Merge conflict in __init__.py
Auto-merging analysisrequest.py
CONFLICT (content): Merge conflict in analysisrequest.py
Automatic merge failed; fix conflicts and then commit the result.

В этот момент ререр поставил резолюции, которые он помнил, и никаких реальных конфликтов не существует. Я могу запустить git commit, а затем продолжить, но моя интеграция-test-build script видит ошибку. Я попытался добавить --rerere-autoupdate в команду git merge, но ничего не меняется. Я настроил репо для включения и автоматического применения совпадений reerere.

Как я могу попросить git merge использовать мои предыдущие разрешения и продолжать без сбоев, если они достаточны?

4b9b3361

Ответ 1

Даже с флагом --rerere-autoupdate git merge, похоже, неохотно автоматически завершает слияние без какого-либо человеческого ввода. В этом случае он выполняется со статусом ошибки, и ваш инструмент интеграции отказывается продолжать.

Я не знаю, как происходит автоматическое слияние, а именно, если вы можете изменить команду git, которая выполняется. Если вы можете, вы можете выполнить следующие команды.

git merge --no-ff branch-to-merge --rerere-autoupdate
if [[ $(git rerere diff) ]]
then
    git commit --no-edit
else
    $(exit 1)
fi
  • git rerere diff файлы списка, которые необходимо разрешить после rerere
  • --no-edit необходимо предотвратить открытие редактора сообщений фиксации
  • В случае, если rerere не смог полностью слить все изменения, этот оператор все равно будет выполняться со статусом ошибки, и слияние не будет выполнено.
    • Сообщение о фиксации по-прежнему будет содержать конфликтующие файлы
  • exit 1 должен находиться внутри $(), если вы не хотите выйти из своей оболочки (угадайте, как я знаю это: -))