Почему применяется git, а я не выполняю? - PullRequest
0 голосов
/ 17 июня 2020

У меня есть файл исправления, который содержит единственное изменение строки. Выполнение git am завершается ошибкой с сообщением:

error: patch failed: Pages/Index.cshtml.cs:15
error: Pages/Index.cshtml.cs: patch does not apply
hint: Use 'git am --show-current-patch=diff' to see the failed patch
Applying: restrict index page to internal users
Patch failed at 0001 restrict index page to internal users
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".

В целевом файле есть пара дополнительных строк над измененной строкой. Это не из-за того, что git не может определить, где меняется одна строка? Если да, значит ли это, что целевой файл и исходный файл должны быть по существу одинаковыми?

Запуск git apply с одним и тем же патчем вызвал это сообщение:

error: patch failed: Pages/Index.cshtml.cs:15
error: Pages/Index.cshtml.cs: patch does not apply

Я считаю, что это в основном то же сообщение, просто дружественное (или, по крайней мере, менее подробное).

Пытаюсь ли я сделать что-то, для чего не предназначены патчи? А именно, применение изменений из одного репозитория к другому, не обладающего эквивалентностью содержимого файлов.

Я нашел этот пост , но при использовании того же решения все, что я получаю, - это без изменений и простой .rej вывод файла.

1 Ответ

1 голос
/ 18 июня 2020

В целевом файле есть пара дополнительных строк над измененной строкой. Это не так, потому что git не может определить, где изменяется одна строка?

Да, это так. Git проверяет не только конкретное c изменение (добавьте это, удалите это), но также контекст , в котором происходит изменение . Если контекст не совпадает, патч не применяется.

Использование -3 или --3way может помочь: идея, лежащая в основе этой опции, заключается в том, что если исправление было выполнено для версии файла, который вы do иметь, в вашем Git репозитории, Git может извлечь эту версию файла, сравнить эту версию с текущей версией, посмотреть, что изменен в вашей копии файла и объединит (как в операциях стиля git merge) ваши изменения и их изменения. Графически представьте себе следующее:

...--o--o--B--o--o--o--C   <-- your current commit and copy of the file
            \
             D   <-- the commit from which the patch was generated

Коммит B - это базовая версия, которую разделяют ваш коммит C и их коммит D. Патч изменяет базовую версию файла. Ваш коммит C имеет другую версию того же файла , но при сравнении D vs B - т.е., что в патче - и , сравнивая C vs B в то же время Git может самостоятельно выяснить, как применить патч, в конце концов.

Уловка здесь в том, чтобы понять, где Git появляется с файл из коммита B. Ответ на этот вопрос находится в строке index, если она есть, в патче. index дает Git информацию, необходимую для поиска копии файла, который будет в фиксации B - при условии, конечно, что у вас действительно есть эта копия файла в вашем репозитории.

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