Что такое git-rerere и как оно работает?

Как я понял, это полезно для синхронизации проектов посредством сохранения информации о разрешении конфликтов, но мне не совсем понятно, как ее использовать и настраивать.

Я хочу настроить для своей среды непрерывной интеграции (CI). Рекомендуется это сделать?

Пожалуйста, не отмечайте дубликат с этим другим вопросом: есть ли какие-либо недостатки в разрешении git rerere?, Потому что мои сомнения не имеют отношения к "Так есть ли какие-либо недостатки в разрешении rerere?. Какие потенциальные проблемы могут возникнуть, которые иначе не возникли бы?"

3 ответа

Что такое git rerere?

Как отмечает документация, rerere обозначает повторное использование записанного решения.

Это, правда, не объясняет, что это такое. Стоит сначала добавить, что git rerere сама команда - это не то, что вы должны запустить. У него всего шесть подкоманд: clear, forget, diff, status, remaining, а также gc, Ни одна из этих записей или повторное использование резолюции - на самом деле, git rerere clear а также git rerere forget <path> просто отмените некоторые записанные разрешения. gc Команда похожа, но относится к старым, а не к текущим.

Большая часть работы происходит от настройки rerere.enabled (что заставляет Git бежать git rerere, без подкоманды, для вас, в подходящее время). Вы можете запустить git rerere без подкоманд, но это на самом деле не делает ничего важного, так как Git сделает это самостоятельно.

git config rerere.enabled true

После того, как вы установили rerere.enabled, когда Git делает слияние - любое слияние, в том числе из git am а также git rebase а также git cherry-pick и так далее, а не только от git merge сам по себе - и попадает в конфликт, Git будет:

  1. запишите (как только глагол объединяет их), конфликтующие фрагменты различий;
  2. ждать, пока вы не решите их вручную;
  3. запись (в git commit время) что вы сделали, чтобы решить их.

Здесь отсутствует шаг, поэтому он нумеруется, начиная с 2. Шаг 1:

  1. проверьте предыдущие записанные разрешения для этих конфликтов: если они существуют, используйте их для автоматического разрешения этих конфликтов.

Если записанные разрешения полностью разрешают конфликты, шаги 2-4 становятся избыточными. Git может по-прежнему запускать их все (я не уверен, что это так), чтобы обновить метки времени записанных разрешений.

Резюме

Как только вы установите rerere.enabled это акт слияния, который создает конфликты и (потому что он автоматически запускается git rerere без аргументов) записывает их, а затем пытается повторно использовать любые существующие записанные разрешения. Это сам акт фиксации, который записывает окончательные разрешения (потому что Git автоматически запускается git rerere опять за тобой). Так что это все автоматически - вам просто нужно убедиться, запустив свой собственный git diff команды, что ваши предыдущие повторно используемые разрешения верны. Если нет, просто исправьте их файлы, добавьте и зафиксируйте как обычно, и Git заменит записанные разрешения новыми.

Обратите внимание, что вы все еще должны git add а также git commit! Вы должны всегда проверять результаты слияния (и / или запускать тесты) - хотя вы должны делать это всегда, независимо от вашего rerere.enabled установка.

Как указывает VonC в комментарии, если у вас есть существующие разрешения конфликтов слияния, которые вы не записали ранее, вы можете "обучить" базу данных повторного использования на этих разрешениях. В исходном коде Git есть скрипт для этого; это также доступно онлайн.

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

Кажется, я не могу заставить скрипт rerere train работать правильно. Он просто продолжает спрашивать меня о моем пин-коде, чтобы подписать то, что я считаю каждым коммитом, доступным в репо.

С git 2.38 (3 квартал 2022 г.) он должен спрашивать вас меньше : "rerere-trainсценарий (вcontrib/) используется в честьcommit.gpgSignпри воссоздании одноразовых слияний. Это было исправлено.

См. (20 июля 2022 г.) Селесты Лю ( CoelacanthusHex).
(Объединено Junio ​​C Hamano -- gitster-- в коммите f0f9a03, 1 августа 2022 г.)

коммит cc391fccontrib/rerere-train: избегайте бесполезного входа gpg на тренировке

Подписано: Селеста Лю

Пользователи могли настроить "" (man) всегда требовать GPG подписывания результирующих коммитов.
Мы не работаем "git merge"пересоздавать коммиты слияния, а просто переиграть конфликты слияния, а получившиеся коммиты мы сразу отбрасываем, подписывать их нет смысла.

Переопределите такую ​​конфигурацию, которая вызывает бесполезную подпись из командной строки с помощью "--no-gpg-sign" вариант.

Другие вопросы по тегам