Как правильно создать и применить файл .patch к одному файлу .cpp, используя diff? - PullRequest
4 голосов
/ 21 августа 2011

Я пытаюсь применить файл .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) окончания строк и после применения к 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 .

Ответы [ 3 ]

9 голосов
/ 22 августа 2011

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

Патч создается с помощью 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

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

1 голос
/ 21 августа 2011

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

0 голосов
/ 03 декабря 2018

Использовать --include флаг.

git apply patch.patch --include=new.cpp
...