Как я могу сделать git am/git применить работу "нечеткой", как команда patch
Я использовал git -формат-патч и git -am, чтобы применить изменения из одного репозитория к другому. Структуры файлов одинаковы, но есть некоторые изменения в репозитории, к которому я отношусь, к чему вызывают большинство патчей, чтобы вывести из строя несколько кусков. Но большинство патч-хаков применяются с небольшим, но нечетким числом строк.
Насколько я могу судить git-am apply
, очень строгая интерпретация так отвергает все эти патчи.
Итак, мой рабочий процесс стал
$ git am ../the-patch.patch
# Fails because the patch doesn't apply cleanly
$ patch -p1 < ../the-patch.patch
# Applies most of the hunks, leaves .rej files for the ones that conflict
# Fix the conflicting hunks manually
$ git am --continue
Было бы неплохо, если бы мне не пришлось запускать патч командной строки, и просто это могло случиться как часть команды am.
Запуск с флагом --reject
, кажется, создает файл .rej со всеми шестеренками в файле, если какой-либо конфликт, который не является тем, что я хочу.
Выполняется с флагом --3way
с
fatal: sha1 information is lacking or useless (the-file.java).
Repository lacks necessary blobs to fall back on 3-way merge.
Cannot fall back to three-way merge.
Я полагаю, это потому, что набор изменений, на котором это было основано, не находится в репозитории, с которым я сливаюсь.
Есть ли способ сделать git-am apply
патч с нечетким совпадением, такой как команда raw patch, и создавать только файлы .rej, содержащие неработающие ханки?
Ответы
Ответ 1
Если я правильно понимаю вас, вы пытаетесь объединить код 1-го репо с другим, и вы не выполняете некоторые части кода. Затем вы исправляете его вручную, и теперь вы хотите, чтобы он был объединен без каких-либо ошибок.
В этом случае вы должны использовать git rerere
В процессе работы с использованием относительно долговечных ветвей темы разработчику иногда необходимо разрешать одни и те же конфликты снова и снова до тех пор, пока не будут завершены ветки темы (либо объединены с ветвью "выпуска", либо отправлены и приняты вверх по течению).
Эта команда помогает разработчику в этом процессе записывать конфликтующие результаты автосекретаря и соответствующие результаты разрешения руки при первоначальном слиянии вручную и применять ранее записанные разрешения рук к их соответствующим результатам автосекретаря.
git config --global rerere.enabled true
Ответ 2
У этого есть задания запроса функции. Чтобы убедиться в этом, присоединитесь к списку рассылки Git (git @vger.kernel.org) и прочитайте его некоторое время, чтобы получить представление о культуре. В то же время проясните свои мысли, подготовив перед/после документации, как было предложено выше.
Когда вы почувствуете себя готовым, представитесь в списке и объясните свою идею. Обязательно рассмотрите вопрос о том, может ли эффект вашего предложения быть достигнут адекватно с помощью других средств. Если вы получите обнадеживающие слова, то последуйте за своей более подробной документацией. С обратной связью от вашего предложения в руке вы можете приступить к отправке ошибки функции-запроса, или вы можете найти себя на месте, чтобы создать патч для рассмотрения.
Ответ 3
На основе потока, который ссылается на @Nick Desaulniers выше, похоже, что использование параметра -3
для git apply
/am
будет работать, по крайней мере, в некоторой степени.
Например, здесь мой вывод с патчем, который не прошел с git apply
:
$ git apply < patch_file.patch
error: patch failed: file_being_patched.txt:489
error: file_being_patched.txt: patch does not apply
$ git apply -3 < patch_file.patch
error: patch failed: file_being_patched.txt:489
Falling back to three-way merge...
Applied patch to 'file_being_patched.txt' cleanly.
Позор, который он по-прежнему дает ошибку (сложнее разобрать вывод в скриптах), и он не говорит, какой уровень fuzz был таким, как patch
, так как уровень fuzz часто является хорошим показателем может ли команда патча ошибиться.