【问题标题】:Why doesn't this patch apply?为什么这个补丁不适用?
【发布时间】:2013-09-02 03:23:14
【问题描述】:

我正在尝试使用git add -p 对索引进行特定的更改。

这是 Git 建议的大块头:

@@ -7,8 +7,15 @@
     <title>{{ page.title }}</title>
     <link rel="stylesheet" href="/css/style.css">
   </head>
-  <body>
-    <div class="content container">
+
+  <body class="container">
+    <ul class="navigation">
+      {% if page.url != '/index.html' %}
+      <li><a href="/">Home</a></li>
+      {% endif %}
+    </ul>
+
+    <div class="content">
       {{ content }}
     </div> 
   </body>

这是我对该补丁的尝试编辑:

@@ -7,5 +7,5 @@                                                                                                                                                                                                                                
     <title>{{ page.title }}</title>                                                                                                                                                                                                           
     <link rel="stylesheet" href="/css/style.css">                                                                                                                                                                                             
   </head>                                                                                                                                                                                                                                     
-  <body>                                                                                                                                                                                                                                      
-    <div class="content container">                                                                                                                                                                                                           
+                                                                                                                                                                                                                                              
+  <body class="container">   

Git 拒绝这个补丁,说:

您编辑的大块不适用。再次编辑(说“不”丢弃!)[y/n]?

我不明白:

  • -+ 都从第 7 行开始
  • -+ 都持续 5 行

当我查看原始文件(如下)并尝试应用我建议的补丁时,这似乎是有道理的。怎么了?

作为参考,这是整个原始文件:

  1 <!DOCTYPE html>                                                                                                                                                                                                                            
  2 <html lang="en">                                                                                                                                                                                                                           
  3   <head>                                                                                                                                                                                                                                   
  4     <meta charset="utf-8">                                                                                                                                                                                                                 
  5     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">                                                                                                                                                                         
  6     <meta name="viewport" content="width=device-width, initial-scale=1.0">                                                                                                                                                                 
  7     <title>{{ page.title }}</title>                                                                                                                                                                                                        
  8     <link rel="stylesheet" href="/css/style.css">                                                                                                                                                                                          
  9   </head>                                                                                                                                                                                                                                  
 10   <body>                                                                                                                                                                                                                                   
 11     <div class="content container">                                                                                                                                                                                                        
 12       {{ content }}                                                                                                                                                                                                                        
 13     </div>                                                                                                                                                                                                                                 
 14   </body>                                                                                                                                                                                                                                  
 15 </html>  

另外,这是我写的 Git 没有抱怨的补丁:

@@ -7,8 +7,9 @@
     <title>{{ page.title }}</title>
     <link rel="stylesheet" href="/css/style.css">
   </head>
-  <body>
-    <div class="content container">
+
+  <body class="container">
+    <div class="content">
       {{ content }}
     </div> 
   </body>

在某些方面它实际上是一个更好的补丁,但我想了解为什么 Git 不喜欢我的第一种方法。

【问题讨论】:

  • 您是否在编辑的补丁中包含了补丁的最后三行(用于上下文)?我不知道这是否重要,但拥有它并没有错。
  • 是的,我的第二次补丁尝试(有效的那个)最后确实有上下文。第一个——有问题的——最后没有上下文。 我逐字发布了所有内容。 有一段时间我认为上下文是强制性的,但我只是遇到了一个 Git 生成的不带结束上下文的补丁。再说一次,那个补丁是针对文件的。所以,我也不知道是否需要上下文。
  • 在上下文中尝试并报告。
  • 这几乎是我的第二种方法,它有效。不幸的是,我已经使用过这种方法并且正在应用其他一些补丁,所以我宁愿不回去:D
  • 你没有比较最小的差异,所以我们不能真正凭经验回答这个问题。希望知道补丁规则的人会根据这些规则回答。

标签: git


【解决方案1】:

至少在默认情况下,补丁中确实需要上下文。通过删除底部上下文,补丁说明更改是文件的最后几行。

通过查看git help apply 手册中的 -C(上下文)选项,它说“默认情况下不会忽略任何上下文。”。您可以使用 git apply -C0 my.patch 忽略上下文,但这当然对您正在进行的交互式编辑没有帮助,因为它似乎使用默认值。

进一步阅读git help add 我注意到一个名为“编辑补丁”的部分,其中包含以下段落,最终说明了一切:

There are also several operations which should be avoided entirely,
as they will make the patch impossible to apply:

   ·   adding context (" ") or removal ("-") lines

   ·   deleting context or removal lines

   ·   modifying the contents of context or removal lines

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 2015-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-10
    相关资源
    最近更新 更多