如何使用diff创建并将.patch文件正确应用到单个.cpp文件?

时间:2011-08-21 12:03:55

标签: git diff patch line-endings

我正在尝试使用 git diff .patch 文件应用于单个 .cpp 文件。

这些是我的文件: old.cpp new.cpp fix.patch

old.cpp 是原始未经修改的源代码, new.cpp 是修改后的来源, fix.patch 是我想要的补丁创建应用于 old.cpp 时应将 new.cpp 中的更改应用到它。 old.cpp new.cpp 都包含 Windows(CR LF)行结尾,两个文件都 918 KB 大,在源中只修改了一行。

我通过将两个文件 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 KB 减少 894 KB 。经过对 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之后输入的内容是什么,所以它按照我想要的方式工作 EM>。 :(

我正在使用 Windows XP SP2 Git 1.7.6 Git Extensions 2.24 Microsoft Visual C ++ 2010

3 个答案:

答案 0 :(得分:8)

好的,我终于解决了这个问题并学到了我的教训。 :)

使用 Git Bash 命令提示符创建补丁:

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

然后确保 old.cpp fix.patch 位于 fix.patch <的相同文件夹的标题中/ strong>读取:

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

之后输入 Git Bash 提示:

git apply fix.patch

瞧!没有线路混乱,错误或问题。我希望有一天能帮助那些偶然发现同样事情的人感谢大家快速而深刻的回复,他们帮助我学到了今天的新知识。 :)

答案 1 :(得分:1)

尝试使用'git apply'代替'patch'来应用补丁。 git apply将调用patch但应遵守任何其他git指令,这些指令可能会在这里排序你的crlf问题。它还接受补丁选项(例如'git apply -p1'用于修剪路径元素)。我经常也使用'git apply'将补丁从git应用到CVS树。 'git apply'不要求目标是git存储库。

答案 2 :(得分:0)

使用--include标志。

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