Как правильно создать и применить файл .patch к одному файлу .cpp с помощью diff?

Я пытаюсь применить файл .patch к одному файлу .cpp, используя git diff.

Это мои файлы: old.cpp , new.cpp и fix.patch.

old.cpp — исходный немодифицированный исходный код, new.cpp — модифицированный исходный код, а fix.patch — патч, который я хочу создать для при применении к old.cpp должны применяться к нему изменения из new.cpp. И old.cpp, и new.cpp имеют окончание строки Windows (CR LF), оба файла имеют размер 918 КБ. > большой, в исходнике модифицируется только одна строка.

Я создаю патч, помещая два файла old.cpp и new.cpp в одну папку и используя приглашение Git Bash с командой:

git diff -u old.cpp new.cpp > fix.patch

Файл fix.patch появляется успешно, но когда я тестирую его и применяю к old.cpp с помощью Git Bash, набираю:

patch old.cpp fix.patch

исправление успешно применяется, но размер old.cpp уменьшается с 918 КБ до 894 КБ. После некоторых исследований с kdiff3 я обнаружил, что мой недавно созданный файл fix.patch имеет окончания строки Unix (LF) и после применения его к < strong>old.cpp, исправленный old.cpp также использует окончания строк Unix (LF). Я предполагаю, что это причина, по которой размер файла old.cpp также уменьшается.

Мой вопрос заключается в том, какую команду я должен использовать в git или что еще мне нужно сделать, чтобы мой недавно созданный файл fix.patch оставался с >Windows (CR LF), и после применения исправления к old.cpp недавно исправленный файл old.cpp имеет Windows (CR LF) тоже заканчиваются строки, и размер файла не уменьшается так резко. Мне здесь предложили использовать git apply вместо patch, но я не знаю, что именно вводить после git apply, поэтому это работает так, как я хочу для моей ситуации. :(

Я использую Windows XP SP2, Git 1.7.6, Git Extensions 2.24 и Microsoft Visual C++ 2010.


person Placeholder    schedule 21.08.2011    source источник
comment
Побочный вопрос: почему у вас есть исходные файлы размером почти 1 МБ?   -  person Oliver Charlesworth    schedule 21.08.2011
comment
Источник написан не мной. И как это соотносится с моим вопросом?   -  person Placeholder    schedule 21.08.2011
comment
Я попытался вручную изменить окончания строк fix.patch из Unix на Windows перед применением, но даже в этом случае после его применения исправленный файл имеет окончания строк в стиле Unix. Пожалуйста помоги.   -  person Placeholder    schedule 21.08.2011
comment
Это не. Вот почему я разместил это как комментарий и поставил перед ним побочный вопрос!   -  person Oliver Charlesworth    schedule 21.08.2011
comment
Немного информации, которая всегда очень важна в вопросах об окончании строки, это: что установлено в core.autocrlf? (Вы можете видеть с git config core.autocrlf.) Другая вещь, которая мне не ясна из вашего вопроса, это то, как именно вы применяете патч? Это с patch в приглашении CygWin, patch в приглашении Git Bash, git apply и т. д.?   -  person Mark Longair    schedule 21.08.2011
comment
Это исходный файл с действиями игрока в популярной MMORPG-игре.   -  person Placeholder    schedule 21.08.2011
comment
Я только что проверил git config core.autocrlf, мне вернули true. Я использую patch в командной строке Git Bash.   -  person Placeholder    schedule 21.08.2011


Ответы (3)


Хорошо, я, наконец, решил проблему и усвоил урок. :)

Патч создается с помощью командной строки Git Bash:

git diff -u old.cpp new.cpp > fix.patch

Затем убедитесь, что old.cpp и fix.patch находятся в одной и той же папке в заголовке fix.patch. читает:

diff --git a/old.cpp b/old.cpp
index 04784e1..da68766 100644
--- a/old.cpp
+++ b/oldcpp

После этого введите в командной строке Git Bash:

git apply fix.patch

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

person Placeholder    schedule 22.08.2011

Попробуйте применить патч, используя «git apply» вместо «patch». git apply вызовет patch, но должен подчиняться любым другим директивам git, которые могут решить вашу проблему с crlf здесь. Он также принимает параметры исправления (например, «git apply -p1» для обрезки элементов пути). Я также довольно часто использую 'git apply' для применения патчей из git к деревьям CVS. «git apply» не требует, чтобы целью был репозиторий git.

person patthoyts    schedule 21.08.2011
comment
Извините, patthoyts, но я действительно неопытен с git apply. Не могли бы вы указать мне, как именно я должен применить мой патч так, как я хочу, используя git apply. Заранее спасибо. :) - person Placeholder; 21.08.2011
comment
Точно так же, как вы использовали бы «патч». Файл патча содержит информацию о файле, который нужно изменить, в заголовке патча, поэтому «git apply -p0 changes.patch» применит патч к текущему каталогу. - person patthoyts; 21.08.2011
comment
О, теперь у меня ошибка - fix.patch:8 trailing whitespace и error: patch failed: old.cpp:1419 и error: old.cpp: patch does not apply - person Placeholder; 21.08.2011
comment
Дайте нам подсказку: неважно, я это исправил. - Было бы полезно знать, чтобы я/другие избегали тех же проблем. - person Philip Oakley; 21.08.2011
comment
@Philip Oakley, я не мог опубликовать ответ в то время, потому что веб-сайт требовал, чтобы я ждал 8 часов, прежде чем ответить самому себе. Я только что опубликовал свое решение. :) - person Placeholder; 22.08.2011

Используйте флаг --include.

git apply patch.patch --include=new.cpp
person Noobie    schedule 03.12.2018