【问题标题】:How to create and apply properly .patch file to a single .cpp file using diff?如何使用 diff 正确创建 .patch 文件并将其应用到单个 .cpp 文件?
【发布时间】:2011-08-21 12:03:55
【问题描述】:

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

这些是我的文件:old.cppnew.cppfix.patch

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

我通过将两个文件 old.cppnew.cpp 放在同一个文件夹中并使用 Git Bash 提示符来创建补丁命令:

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

fix.patch 文件成功显示,但当我实际测试它并使用 Git Bash 将其应用到 old.cpp 时,键入:

patch old.cpp fix.patch

补丁已成功应用,但 old.cpp 减小918 KB894 KB >。在对 kdiff3 进行一些研究后,我发现我新创建的 fix.patch 文件以 Unix (LF) 行结尾,并将其应用于 old.cpp,修补后的 old.cpp 也采用 Unix (LF) 行结尾。我想这就是 old.cpp 的文件大小也减小的原因。

我的问题是我应该在 git 中使用什么 command 或者我还需要做什么才能保留我新创建的 fix.patch 文件带有 Windows (CR LF) 行结尾,并且在将补丁应用到 old.cpp 后,新修补的 old.cpp 文件带有 Windows (CR LF) 也以行结尾,文件大小并没有大幅减少。我在这里收到了使用git apply 代替patch 的建议,但我不知道在git apply 之后输入什么内容,所以它按照我的情况工作。 :(

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

【问题讨论】:

  • 一个小问题:为什么你的源文件大小接近 1MB?
  • 源码不是我写的。这与我的问题有什么关系?
  • 我尝试在应用之前手动将来自 Unix 的 fix.patch 的行尾更改为 Windows,但即便如此,在应用它之后,修补文件仍采用 Unix 样式的行尾。请帮忙。
  • 不是。这就是为什么我将其作为评论发布,并在其前面加上“附带问题”!
  • 我刚刚检查了git config core.autocrlf,它返回给我true。我在“Git Bash”提示中使用patch

标签: git diff patch line-endings


【解决方案1】:

好的,我终于解决了这个问题,也吸取了教训。 :)

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

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

然后确保old.cppfix.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

瞧!没有线路混乱、错误或问题。我希望这能帮助有一天偶然打开同样东西的人感谢大家快速而深入的回复,他们帮助我今天学到了一些新东西。 :)

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我很抱歉 patthoyts,但我对git apply 真的很陌生。您是否介意指出我应该如何使用git apply 以我想要的方式应用我的补丁。先感谢您。 :)
    • 就像您使用“补丁”一样。补丁文件包含有关要在补丁头中修改的文件的信息,因此“git apply -p0 changes.patch”会将补丁应用到当前目录。
    • 哦,现在我遇到了错误 - fix.patch:8 trailing whitespaceerror: patch failed: old.cpp:1419error: old.cpp: patch does not apply
    • 给我们一个线索:“没关系,我修好了。” - 知道这样我/其他人避免同样的问题会很有用..
    • @Philip Oakley,我当时无法发布答案,因为网站要求我等待 8 小时才能回复自己。我刚刚发布了我的解决方案。 :)
    【解决方案3】:

    使用--include 标志。

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

    【讨论】:

      猜你喜欢
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      • 2016-11-22
      • 2020-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多