如何制作像这种风格的补丁

时间:2014-07-26 03:35:29

标签: git diff patch

这是来自gdb-7.6.patch文件的内容:

--- gdb-7.6/libiberty/Makefile.in.orig
+++ gdb-7.6/libiberty/Makefile.in
@@ -175,6 +175,7 @@ REQUIRED_OFILES =                           \
./getruntime.$(objext) ./hashtab.$(objext) ./hex.$(objext)  \
./lbasename.$(objext) ./lrealpath.$(objext)         \
./make-relative-prefix.$(objext) ./make-temp-file.$(objext) \
+   ./mkstemps.$(objext)                        \
./objalloc.$(objext)                        \
./obstack.$(objext)                     \
./partition.$(objext) ./pexecute.$(objext) ./physmem.$(objext)  \
@@ -206,7 +207,7 @@ CONFIGURED_OFILES = ./asprintf.$(objext)
./index.$(objext) ./insque.$(objext)                \
./memchr.$(objext) ./memcmp.$(objext) ./memcpy.$(objext)    \
./memmem.$(objext) ./memmove.$(objext)              \
-    ./mempcpy.$(objext) ./memset.$(objext) ./mkstemps.$(objext)    \
+    ./mempcpy.$(objext) ./memset.$(objext)             \
./pex-djgpp.$(objext) ./pex-msdos.$(objext)         \
 ./pex-unix.$(objext) ./pex-win32.$(objext)         \
 ./putenv.$(objext)                     \
--- gdb-7.6/opcodes/i386-dis.c.orig
+++ gdb-7.6/opcodes/i386-dis.c
@@ -11510,6 +11510,10 @@ print_insn (bfd_vma pc, disassemble_info
   threebyte = *++codep;
   dp = &dis386_twobyte[threebyte];
   need_modrm = twobyte_has_modrm[*codep];
+      if (dp->name && ((strcmp(dp->name, "ud2a") == 0) || 
+(strcmp(dp->name, "ud2") ==   0))) {
+        extern int kernel_BUG_encoding_bytes(void);
+        codep += kernel_BUG_encoding_bytes();
+      }
   codep++;
 }
else
--- gdb-7.6/gdb/dwarf2read.c.orig
+++ gdb-7.6/gdb/dwarf2read.c
@@ -2670,7 +2670,11 @@ read_index_from_section (struct objfile
  indices.  */
if (version < 4)
 {
+#ifdef CRASH_MERGE
+      static int warning_printed = 1;
+#else
   static int warning_printed = 0;
+#endif
   if (!warning_printed)
{
  warning (_("Skipping obsolete .gdb_index section in %s."),
@@ -2689,7 +2693,11 @@ read_index_from_section (struct objfile
  "set use-deprecated-index-sections on".  */
if (version < 6 && !deprecated_ok)
 {
+#ifdef CRASH_MERGE
+      static int warning_printed = 1;
+#else
   static int warning_printed = 0;
+#endif
   if (!warning_printed)
{
  warning (_("\

我想知道这个补丁是如何制作的。我猜在制作补丁之前,应该有六个文件,其布局是这样的:

gdb-7.6/libiberty/Makefile.in.orig
gdb-7.6/libiberty/Makefile.in
gdb-7.6/opcodes/i386-dis.c.orig
gdb-7.6/opcodes/i386-dis.c
gdb-7.6/gdb/dwarf2read.c.orig
gdb-7.6/gdb/dwarf2read.c

文件以&#39; orig&#39;结尾。后缀是orignal文件,而其他文件是 我试了一下diff -uNr,因此产生了3个补丁,但我不知道如何生成包含所有变化的补丁。任何人都可以告诉我如何实现这一目标吗? 谢谢!

2 个答案:

答案 0 :(得分:2)

@VonC几乎完全基于差异有一个很好的解决方案,但我对shell的热爱不能让这个问题没有基于文件操作的答案。 :)

如果你可以创建你想要的3个,你总是可以按照你想要的方式附加信息:

diff -ruN gdb-7.6/libiberty/Makefile.in{.orig,} > gdb-7.6.patch
diff -ruN gdb-7.6/opcodes/i386-dis.c{.orig,} >> gdb-7.6.patch
diff -ruN gdb-7.6/gdb/dwarf2read.c{.orig,} >> gdb-7.6.patch

答案 1 :(得分:1)

This article "How to Make and Apply Patches"提及:

  

对于多个文件,这个过程稍微复杂一点   假设您有一个文件夹“original”和一个文件夹“changed”,后者包含前者文件的多个更改版本。
  如果您调用diff传递文件夹名称而不是文件名,则会导致差异将一个文件夹中的file1与第二个文件夹中的file1进行比较,这正是我们所需要的。

diff -rupN original changed > original.patch

在您的情况下,您需要:

  • gdb-7.6.ori文件夹内容未触动
  • 您当前的gdb-7.6文件夹,其中包含更改